it-swarm.asia

فشل في الحصول على خلية من DataSource الخاص به

ما هو الخطأ في الكود أدناه

-(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>)'

لقد قمت بتعيين مندوب ومصدر البيانات لعرض الجدول

60
Rishab

يشير خطأك إلى أن cellForRowAtIndexPath يُرجع nil لسبب ما ، وأظن أنه بسبب فشلك في إلغاء تثبيت خلية قابلة لإعادة الاستخدام. إذا كنت ترغب في تأكيد ذلك ، فما عليك سوى تعيين نقطة توقف بعد مكالمة dequeue الحالية الخاصة بك: أتوقع أن تجد cell مضبوطًا على nil.

إذا كنت تستخدم قوالب Xcode الحديثة حيث تصنع خلية نموذج أولي لك ، فمن المحتمل أنك تستخدم هذا بدلاً من ذلك:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

إذا كنت لا تستخدم قالب Xcode ، فاستخدم سطر التعليمات البرمجية هذا على أي حال ، ثم سجل معرف إعادة الاستخدام الخاص بك مثل هذا:

[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];

كل شيء على ما يرام ينبغي أن يحل المشكلة. لقد كتبت هذا بمزيد من التفاصيل لمستخدمي Swift.

74
TwoStraws

باستخدام Swift 3 ، صادفت هذا الخطأ عندما نسيت إضافة بروتوكولي UITableViewDataSource و UITableViewDelegate إلى إعلان ViewController.

class DataViewController: UIViewController ، UITableViewDataSource ، UITableViewDelegate

مضيفا لهم إصلاح المشكلة.

148
David Reidy

سويفت 3.0

تحتاج فقط إلى إضافة UITableViewDelegate و UITableViewDataSource

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

الصورة أدناه هي فقط للرجوع اليها.

 enter image description here 

43
Vivek

عليك أن تعطي الخلية معرفًا. "الخلية" تعطي معرف الخلية كما هو الحال في مفتش السمات للخلية في حقل المعرف. لقد أعدت إنتاج الخطأ الخاص بك ، ويرجع ذلك إلى أنك لم تقدم معرفًا لخليتك.

3
Muhammad Zohaib Ehsan

في حالتي ، لقد نسيت أن تعلن UITableViewDataSource ، UITableViewDelegate لـ UITableview.

2
prakash singh

كان لدي نفس المشكلة وكان ذلك لأنني نسيت تنفيذ بروتوكولات UITableViewDataSource و UITableViewDelegate

فقط أضفهم إلى إعلان الفصل الخاص بك بعد الفصل الموروث

يجب أن يحذرني xcode من ذلك ، لأنني استخدمت أساليب UITableViewDataSource و UITableViewDelegate في الكود الخاص بي

2
Mohsen Hossein pour

تحقق مما إذا تمت إضافة UITableViewDataSource. فاتني هذا ، لذلك كان التطبيق يتعطل

1
Urvish Modi

تأكد من أنك لم تنس تطبيق بروتوكول UITableViewDelegate و UITableViewDataSource.

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

1
Mohsin Qureshi

يرجى أيضا محاولة الرمز أدناه

 - (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;
}
1
user3182143

يجب عليك تجاوز طريقة 'cellForRowAt'. انتبه إذا لم تفعل ذلك

0
oskarko

ربما لا تستخدم نفس المعرّف الذي قدمته في لوحة القصة الرئيسية لخلية النموذج الأولي. حاول إختصار اسم الحالة العلوية الصغيرة بالإضافة إلى التأكد من أنك تستخدم المعرف الصحيح.

حظا سعيدا:)

0
Nikita Sharma Sahu

إذا لم تقم بتحميل Nib ، فعليك أولاً تسجيل Nib في viewDidLoad.

 [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
0
GSK

في حالتي ، لقد نسيت التغيير من النموذج الديناميكي إلى الخلية الساكنة ، والتحقق من هذا الجزء في أداة إنشاء الواجهة

0
sarah

بعد القيام بالخطوات المقترحة في المنشورات الأخرى ، والتحقق مما إذا كانت خليتي لا شيء ، لم يتم حل مشكلتي وكانت خليتي لا تظهر على أنها لا شيء عند التحقق منها. ومع ذلك ، فإن إضافة مقتطف الشفرة المفيد هذا أدى إلى حل المشكلة ، لذلك يجب ألا يكون هناك شيء في وقت ما لم أتمكن من ملاحظته.

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
0
jungledev

عند استخدام tableViewCell بصرف النظر عن UITableView ، يجب عليك تسجيل NIB بنفسك. عندما لم يتم تسجيل NIB ، قد يحدث خطأ "فشل في الحصول على خلية من DataSource". من وصف الخطأ ، أجد دائمًا صعوبة في معرفة ما هو الخطأ.

يمكن حل هذا الخطأ بسهولة عن طريق التسجيل:

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
0
Vincent

حذر عند الترحيل
في حالة قيام أي شخص بترحيل التعليمات البرمجية الخاصة به من إصدارات 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"
0
Mehdi