无法从其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; } 

但是我无法从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>)' 

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

你的错误表明, cellForRowAtIndexPath由于某种原因返回nil ,我猜这是因为你没有出队一个可重用的单元格。 如果你想确认这一点,只需在当前的出队调用之后设置一个断点:我希望你会发现cell被设置nil

如果你正在使用现代的Xcode模板,你得到了一个为你制作的原型单元格,你应该使用它来代替:

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

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

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

所有这一切都应该解决问题。 我为Swift用户更详细地写了这个。

使用Swift 3我忘记将UITableViewDataSource和UITableViewDelegate协议添加到ViewController声明中时遇到此错误。

类DataViewController:UIViewController, UITableViewDataSourceUITableViewDelegate

添加他们解决了这个问题。

Swift 3.0

你只需要添加UITableViewDelegateUITableViewDataSource

 import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

下图仅供参考。

在这里输入图像说明

你必须给单元格一个标识符。 “标识符”字段中单元格的属性检查器中的“单元格”给出单元格的标识符。 我重新产生你的错误,这是由于你没有给你的单元格标识符。

我有同样的问题,这是因为我忘了实现UITableViewDataSource和UITableViewDelegate协议

只需将它们添加到inheritance类之后的类声明中即可

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

也请尝试下面的代码

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

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

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

祝你好运:)

如果你没有加载Nib,那么你必须先注册NID在viewDidLoad。

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

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

这个错误很容易通过注册来解决:

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

在完成了其他post中build议的步骤之后,检查我的单元格是否为零,但是我的问题没有解决,而且当我检查它时,我的单元格显示为零。 然而,在这里添加这个方便的代码片段确实解决了这个问题,所以在我没有捕获它的时候,它一定是零。

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

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