UITableView dataSource必须从tableView返回一个单元格:cellForRowAtIndexPath:Exception

时间:2010-02-08 19:37:22

标签: iphone uitableview

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

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

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

感谢您的帮助!

9 个答案:

答案 0 :(得分:66)

你回来了朋友凯尔,而且很可能是零。

您的代码看起来很好,因此请确保您正确设置了Interface Builder文件。在FriendTableViewCell.xib中,确保文件所有者是您的表视图控制器,并且您正确地将单元格设置为friendCell的出口(我假设它是一个UITableViewCell)。

答案 1 :(得分:33)

对我来说,它的工作原理是:

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

<强>更新
将上述代码放在以下方法中:

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

只需将 BEFORE 编辑为tableViewCell

即可

答案 2 :(得分:2)

您正在创建FriendTableViewCell,然后忽略它并将其设置为(大概)名为friendCell的实例变量。

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

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

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

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

其次,friendCell可能是零。确保NIB设置正确并且出口指向正确的位置。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我发现在初始化表视图之前尝试创建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);

答案 5 :(得分:0)

请看这里: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对象,然后将nib对象设置为nil。

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

使用此,

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

我只用这几行就节省了几个小时。

答案 8 :(得分:0)

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

 static NSString *CellIdentifier = @"Cell";