【问题标题】:UITableView dequeueReusableCellWithIdentifier: returning nilUITableView dequeueReusableCellWithIdentifier:返回 nil
【发布时间】:2011-12-20 15:39:07
【问题描述】:

我有一个应用程序,它有一个带有各种自定义 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,尽管刚刚离开屏幕的单元格与我插入的类型相同(相同的单元格标识符)。

不应该给一个可重复使用的细胞吗?就我而言,这可能会成为问题,因为我的单元格由于其复杂性而具有某种“繁重”的 init 方法。

提前致谢

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

【问题讨论】:

  • 这是正常行为,您插入的单元格尚不存在,因此控制器必须实例化它。
  • 但是我插入的单元格与刚刚退出可见的单元格的类型(和标识符相同)相同,现在应该可以重复使用,不是吗?

标签: iphone objective-c uitableview reuseidentifier


【解决方案1】:

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

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

【讨论】:

  • 是的,我知道我不应该在单元格的初始化中做任何耗时的事情。我所说的“重”是指 10-15 个 imageViews 以及其他控件,而且我可以同时添加多个对象,因此必须创建多个单元格实例(因为它们没有出队),这可能会使 UI 有点冻结。问题是“为什么缓存中没有未使用的实例返回,因为某些单元格刚刚退出可见?”
  • UITableView 如何管理其缓存的确切细节是不透明的。您有性能问题还是担心其中一个问题?这听起来不像你的细胞结构。应该是个问题。创建/添加子视图没问题。不确定“创建多个单元格实例”是什么意思。这就是一张桌子的全部目的。
  • 如果您在indexPath 的许多单元格中制作动画,它们都将在其中显示,您应该简单地更新数据源并使用[tableView reloadData]
  • '不确定“创建多个单元格实例”是什么意思。':例如,如果我同时添加 5 个对象并且它们适合表格视图的可见区域,则需要将这些单元格出列/实例化,如果每个实例化需要 100 毫秒,我将在该操作上冻结半秒。我现在没有遇到这个问题,但我可能
  • 没问题。我建议您不要担心何时获得出列与新实例。通常,是的,您应该期望在滚动时获得出列实例。在插入期间,您可能会或可能不会得到一些,这取决于 tableView 的内部状态。很难准确预测(因此不值得担心)。 :)
猜你喜欢
  • 2014-09-27
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2012-11-02
相关资源
最近更新 更多