UITableView 数据源必须从 tableView 返回一个单元格:cellForRowAtIndexPath:异常

Posted

技术标签:

【中文标题】UITableView 数据源必须从 tableView 返回一个单元格:cellForRowAtIndexPath:异常【英文标题】:UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: Exception 【发布时间】:2010-02-08 19:37:21 【问题描述】:

我实际上没有看到我的错误:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  static NSString *CellIdentifier = @"Cell";

  FriendTableViewCell *cell = (FriendTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) 
      cell = [[[FriendTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
      [[NSBundle mainBundle] loadNibNamed:@"FriendTableViewCell" owner:self options:nil];
      cell = friendCell;
  
  cell.lblNickname.text =  @"Tester";
  return cell;

我做错了什么?我检查了两次.. 但没有看到错误。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

你正在返回friendCell,它很可能是nil。

您的代码看起来不错,因此请确保您的 Interface Builder 文件设置正确。在 FriendTableViewCell.xib 中,确保 File's Owner 是您的表格视图控制器,并且您正确地将单元格设置为friendCell(我假设是 UITableViewCell)的出口。

【讨论】:

谢谢,再次检查后,我发现 Interface Builder 中的插座连接丢失! 谢谢,您的回答正是我所需要的。我更改了视图控制器类的名称,在没有考虑的情况下中断了与 IB 的连接。不要再改名字了,因为我不喜欢他们! 很好的答案,通常问题在于返回一个零单元格! 如果您在 UIViewController 中有 UITableView,请确保您已创建从 UITableView 到 UIViewController 的出口连接。【参考方案2】:

对我来说,这样做很有效:

if (cell == nil) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

更新 将上面的代码放在如下方法中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

只是把它放在之前编辑tableViewCell

【讨论】:

【参考方案3】:

您正在创建一个FriendTableViewCell,然后忽略它并将其设置为(可能)等于名为friendCell 的实例变量。

我假设您希望在调用 loadNibNamed 方法时设置friendCell。显然没有设置。

所以这段代码有两个问题。首先,不要两次分配一个单元格。

cell = [[[FriendTableViewCell ....
[[NSBundle mainBundle .....
cell = friendCell;

显然,如果您用第二次调用分配给单元格来覆盖它,那么创建一个新单元格并将其分配给单元格是没有用的。

其次,friendCell 可能为零。确保 NIB 设置正确并且插座指向正确的位置。

【讨论】:

感谢您的帮助! friendCell 是我的 Outlet,如何正确设置?【参考方案4】:

我知道这是一篇旧帖子,但是我刚刚遇到了这个错误,我发现它很奇怪,因为该应用程序正在测试中,所以几天没有新的构建,它做到了,我所做的只是重新启动电话解决了。

【讨论】:

【参考方案5】:

我发现在初始化我的表格视图之前尝试创建我的 UITableViewCell 时出现了这个问题:

这里在创建tableView之前注册类会报错,放在之后会修复报错。

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:bCellIdentifier]; 

tableView = [[UITableView alloc] initWithFrame:CGRectZero];
tableView.delegate = self;
tableView.dataSource = self;

[self addSubview:tableView];

tableView.keepInsets.equal = KeepRequired(0);

【讨论】:

在我的情况下,我调用该函数在表格 UITableViewCell 注册之前加载数据,赞成你的回答帮助我克服这个问题【参考方案6】:

看这里:Loading TableViewCell from NIB

这是 Apple 针对该主题的文档。

//This is assuming you have tvCell in your .h file as a property and IBOutlet
//like so:
TableViewController.h
@property(nonatomic,retain) IBOutlet UITableViewCell *tvCell;
//Data Source Method...
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) 

    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];

    cell = tvCell;

    self.tvCell = nil;

使用 loadNibNamed:owner:options 方法在笔尖中加载单元格。将单元格实例设置为您的 nib 对象,然后将 nib 对象设置为 nil。

阅读我链接的其余文档,了解如何访问单元格内的子视图。

【讨论】:

【参考方案7】:

不要忘记在 Interface Builder 中设置 cell identifier

【讨论】:

【参考方案8】:

使用这个,

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellID];

仅此几行,我又节省了几个小时。

【讨论】:

【参考方案9】:

确保您的原型单元的 NIB / Storyboard 文件中的重用标识符与您称为 CellIdentifier 的任何内容匹配

 static NSString *CellIdentifier = @"Cell";

【讨论】:

以上是关于UITableView 数据源必须从 tableView 返回一个单元格:cellForRowAtIndexPath:异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在滚动时更新 UITableView 数据

如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview

UITableView 数据源必须从 tableView 返回一个单元格:cellForRowAtIndexPath:异常

UITableView 数据源必须从 tableView 返回单元格:cellForRowAtIndexPath

UITableView 多个动作

如何填充 UITableView 部分标题?