ما هو الخطأ في الكود أدناه
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = @"hello";
return cell;
}
و
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 2;
}
لكنني أتلقى فشل في الحصول على خلية من مصدر بياناته
الاستثناء بأكمله هو
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'
لقد قمت بتعيين مندوب ومصدر البيانات لعرض الجدول
يشير خطأك إلى أن cellForRowAtIndexPath
يُرجع nil
لسبب ما ، وأظن أنه بسبب فشلك في إلغاء تثبيت خلية قابلة لإعادة الاستخدام. إذا كنت ترغب في تأكيد ذلك ، فما عليك سوى تعيين نقطة توقف بعد مكالمة dequeue الحالية الخاصة بك: أتوقع أن تجد cell
مضبوطًا على nil
.
إذا كنت تستخدم قوالب Xcode الحديثة حيث تصنع خلية نموذج أولي لك ، فمن المحتمل أنك تستخدم هذا بدلاً من ذلك:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
إذا كنت لا تستخدم قالب Xcode ، فاستخدم سطر التعليمات البرمجية هذا على أي حال ، ثم سجل معرف إعادة الاستخدام الخاص بك مثل هذا:
[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];
كل شيء على ما يرام ينبغي أن يحل المشكلة. لقد كتبت هذا بمزيد من التفاصيل لمستخدمي Swift.
باستخدام Swift 3 ، صادفت هذا الخطأ عندما نسيت إضافة بروتوكولي UITableViewDataSource و UITableViewDelegate إلى إعلان ViewController.
class DataViewController: UIViewController ، UITableViewDataSource ، UITableViewDelegate
مضيفا لهم إصلاح المشكلة.
عليك أن تعطي الخلية معرفًا. "الخلية" تعطي معرف الخلية كما هو الحال في مفتش السمات للخلية في حقل المعرف. لقد أعدت إنتاج الخطأ الخاص بك ، ويرجع ذلك إلى أنك لم تقدم معرفًا لخليتك.
في حالتي ، لقد نسيت أن تعلن UITableViewDataSource ، UITableViewDelegate لـ UITableview.
كان لدي نفس المشكلة وكان ذلك لأنني نسيت تنفيذ بروتوكولات UITableViewDataSource و UITableViewDelegate
فقط أضفهم إلى إعلان الفصل الخاص بك بعد الفصل الموروث
يجب أن يحذرني xcode من ذلك ، لأنني استخدمت أساليب UITableViewDataSource و UITableViewDelegate في الكود الخاص بي
تحقق مما إذا تمت إضافة UITableViewDataSource. فاتني هذا ، لذلك كان التطبيق يتعطل
تأكد من أنك لم تنس تطبيق بروتوكول UITableViewDelegate و UITableViewDataSource.
class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
يرجى أيضا محاولة الرمز أدناه
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
// Reuse and create cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Update cell data contents
cell.textLabel.text = @"Your text here";
[email protected]"Your detailed text label";
return cell;
}
يجب عليك تجاوز طريقة 'cellForRowAt'. انتبه إذا لم تفعل ذلك
ربما لا تستخدم نفس المعرّف الذي قدمته في لوحة القصة الرئيسية لخلية النموذج الأولي. حاول إختصار اسم الحالة العلوية الصغيرة بالإضافة إلى التأكد من أنك تستخدم المعرف الصحيح.
حظا سعيدا:)
إذا لم تقم بتحميل Nib ، فعليك أولاً تسجيل Nib في viewDidLoad.
[self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
في حالتي ، لقد نسيت التغيير من النموذج الديناميكي إلى الخلية الساكنة ، والتحقق من هذا الجزء في أداة إنشاء الواجهة
بعد القيام بالخطوات المقترحة في المنشورات الأخرى ، والتحقق مما إذا كانت خليتي لا شيء ، لم يتم حل مشكلتي وكانت خليتي لا تظهر على أنها لا شيء عند التحقق منها. ومع ذلك ، فإن إضافة مقتطف الشفرة المفيد هذا أدى إلى حل المشكلة ، لذلك يجب ألا يكون هناك شيء في وقت ما لم أتمكن من ملاحظته.
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
عند استخدام tableViewCell بصرف النظر عن UITableView ، يجب عليك تسجيل NIB بنفسك. عندما لم يتم تسجيل NIB ، قد يحدث خطأ "فشل في الحصول على خلية من DataSource". من وصف الخطأ ، أجد دائمًا صعوبة في معرفة ما هو الخطأ.
يمكن حل هذا الخطأ بسهولة عن طريق التسجيل:
[self registerNib:[customerButtonTableViewCell class]
forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
حذر عند الترحيل
في حالة قيام أي شخص بترحيل التعليمات البرمجية الخاصة به من إصدارات Swift الأقدم إلى الإصدارات الأحدث ، فقد يحدث هذا إذا لم تقم بتغيير بنية UITableViewDataSource
to عن غير قصد إلى صيغة Swift الأحدث.
للأسف لن يشتكي المترجم من ذلك.
واجهت هذا عندما كنت أقوم بترحيل الكود الخاص بي من Swift 2 إلى Swift 4. لم أقم بتغيير بناء جملة طريقة cellForRow DataSource من:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
إلى إصدار Swift 4 الخاص به:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
وحصلت على الخطأ:
"Failed to obtain a cell from its DataSource"