以下代码有什么问题
-(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>)'
我为表格视图设置了委托和数据源
答案 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)
您只需要添加 UITableViewDelegate 和 UITableViewDataSource
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
答案 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)
我知道这个问题已经很老了,但是对于我来说,问题是该单元格不是目标成员的一部分。
所以我要做的解决方法是将其包括在目标成员中。