无法从其DataSource获取单元格

时间:2015-12-13 11:29:10

标签: ios objective-c uitableview

以下代码有什么问题

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

但我无法从其dataSource获取单元格

整个例外是

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

我为表格视图设置了委托和数据源

17 个答案:

答案 0 :(得分:148)

使用Swift 3当我忘记将UITableViewDataSource和UITableViewDelegate协议添加到ViewController声明时,我遇到了这个错误。

类DataViewController:UIViewController, UITableViewDataSource UITableViewDelegate

添加它们解决了问题。

答案 1 :(得分:74)

您的错误表明cellForRowAtIndexPath由于某种原因正在返回nil,我猜这是因为您未能将可重复使用的单元格出列。如果你想确认这一点,只需在当前的出列呼叫后设置一个断点:我希望你会发现cell设置为nil

如果您正在使用现代Xcode模板,您可以获得为您制作的原型单元格,那么您应该使用它:

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

如果您没有使用Xcode模板,请使用该行代码,然后注册您自己的重用标识符,如下所示:

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

一切都很好,应该解决问题。 I wrote this up in more detail for Swift users.

答案 2 :(得分:43)

Swift 3.0

您只需要添加 UITableViewDelegate UITableViewDataSource

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

下图仅供您参考。

enter image description here

答案 3 :(得分:3)

您必须为单元格指定标识符。 “Cell”给出了标识符字段中单元格的属性检查器中的单元标识符。 我重新产生了您的错误,这是因为您没有为您的单元格提供标识符。

答案 4 :(得分:2)

我遇到了同样的问题,因为我忘了实现UITableViewDataSource和UITableViewDelegate协议

在继承的类

之后将它们添加到类声明中

xcode必须警告我,因为我在代码中使用了UITableViewDataSource和UITableViewDelegate方法

答案 5 :(得分:2)

在我的情况下,我忘了为UITableview声明UITableViewDataSource,UITableViewDelegate。

答案 6 :(得分:1)

另请尝试以下代码

 - (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";
    cell.detailTextLabel.text=@"Your detailed text label";

    return cell;
}

答案 7 :(得分:1)

检查是否添加了添加的UITableViewDataSource。我错过了这个,所以应用程序崩溃了

答案 8 :(得分:1)

确保您没有忘记实现UITableViewDelegate和UITableViewDataSource协议。

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

答案 9 :(得分:0)

当使用tableViewCell而不是UITableView时,你必须注册 NIB自己。当NIB未注册时,可能会出现“无法从其DataSource获取单元”错误。 从错误描述中我总是发现很难弄清楚,出了什么问题。

注册时可以轻松解决此错误:

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

答案 10 :(得分:0)

在完成其他帖子中建议的步骤后,检查我的单元格是否为零,我的问题没有解决,当我检查时,我的单元格显示为nil。但是,在那里添加这个方便的代码片段确实解决了这个问题,所以在我没有抓住它的某些时候它一定是零。

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

答案 11 :(得分:0)

如果您没有加载Nib,则必须先在viewDidLoad中注册Nib。

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

答案 12 :(得分:0)

可能您没有使用您在主故事板中为原型单元格提供的相同标识符。尝试使用大写小写的名称,以确保使用正确的标识符。

祝你好运:)

答案 13 :(得分:0)

在我的情况下,我忘记了从动态原型更改为静态单元格,请在界面生成器中检查此部分

答案 14 :(得分:0)

迁移时请小心
万一有人将其代码从较早的swift版本迁移到较新的版本,如果您无意中不将UITableViewDataSource函数的语法更改为较新的swift语法,则可能会发生这种情况。
不幸的是,编译器不会对此抱怨。
当我将代码从swift 2迁移到swift 4时遇到了这个问题。我没有将cellForRow DataSource方法的语法从以下位置更改:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   

转换为迅捷的4版本:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  

我得到了错误:

"Failed to obtain a cell from its DataSource"

答案 15 :(得分:0)

您必须重写'cellForRowAt'方法。如果没有做的话要小心

答案 16 :(得分:0)

我知道这个问题已经很老了,但是对于我来说,问题是该单元格不是目标成员的一部分。

所以我要做的解决方法是将其包括在目标成员中。