UITableView dequeueReusableCellWithIdentifier:返回nil

时间:2011-12-20 15:39:08

标签: iphone objective-c uitableview reuseidentifier

我有一个应用程序,它有一个带有各种自定义UITableViewCells(和单元标识符)的UITableView。

在我实现的tableView:cellForRowAtIndexPath:方法中,我使用了UITableView的dequeueReusableCellWithIdentifier:方法,它在用户滚动表格时调用时给了我一个期望类型的UITableViewCell,但是,如果我尝试检索可重用的代码的其他部分中的单元格我得到的结果是nil,因此必须实例化一个新的单元格。

例如,我插入要显示的新对象的代码如下所示:

...
[myDataSource addObject:newObject];
...
[self.tv beginUpdates];
[self.tv insertRowsAtIndexPaths:paths withRowAnimation:rowAnimation];
[self.tv endUpdates];
...

触发tableView:cellForRowAtIndexPath:并且在该调用上dequeueReusableCellWithIdentifier:返回nil,尽管刚离开屏幕的单元格是我插入的相同类型(相同的单元格标识符)。

不应该给可重复使用的细胞吗?在我的情况下,这可能会成为问题,因为我的单元格由于其复杂性而具有某种“重”的初始化方法。

提前致谢

Edit1:为了澄清,我想知道为什么表缓存中没有未使用的单元格实例要返回,因为某些单元格(我插入的相同类型)只是退出可见?

1 个答案:

答案 0 :(得分:4)

每个正在使用的单元格都需要它自己的唯一实例。当您滚动表格时,iOS会缓存不再使用的单元格,而tableView:dequeueReusableCellWithIdentifier:返回的是未使用的实例。在您的情况下,缓存中没有未使用的实例返回。

就你的init方法而言,你不应该在那里做任何耗费时间。例如,如果要下载要在单元格中显示的远程内容,则应在后台执行此操作,并在完成后更新表格/单元格。