当预期时,UITableView cellForRowAtIndexPath单元格不是nil

时间:2010-09-24 19:50:00

标签: iphone uitableview

我的UIViewController类中有一个分组的UITableView,我发现有时出列的单元格并不像预期的那样是零。

该表有3个部分可供使用,并且一旦调用'viewDidLoad',就会启动服务器调用以查明是否有更多部分。在视图被呈现之前,服务器的响应到了,我们被告知我们有4个部分。为了应对这种变化,我做了:

[self.tableview beginUpdates]

// Do the updating of the array that holds table data

[self.tableview endUpdates]
[self.tableview reloadData];

接下来我接到'numberOfSectionsInTableView'的调用,为此我返回4,然后是'numberOfRowsInSection',我将返回预期的正确行数。请注意,这是我第一次获得这些调用中的任何一个,因为表重新加载发生的速度非常快,甚至在视图呈现之前。

此时,只有前3个部分的数据可见,并滚动查看最后一部分。当你滚动查看最后一节时,我期望在'tableView:cellForRowAtIndexPath'调用中的一个单元格不是预期的nil。单元格类型实际上是用于另一个部分的内容(我有两种类型的UITableViewCell用于前两个部分,另一个用于我正在创建的最后两个部分,当cell为nil时,在cellForRowAtIndexPath中返回)。

那么UITableView如何确定哪个单元格出列,以及如何找出为什么这个特定区域/行的单元格真的不应该为零呢?

2 个答案:

答案 0 :(得分:2)

您使用的是什么用于您的小区标识符?这是UITableView在确定要出列什么时将使用的内容。如果您有不同类型的单元格,则需要使用不同的重用标识符。

答案 1 :(得分:2)

单元重用的想法归结为最小化视图分配和内部UITableViewCell设置,以提高滚动性能。粗略地说,每当一个单元格离开屏幕时,表格视图会将其作为子视图从自身中删除并将其添加到池中。下次需要显示单元格时,可以从池中取出未使用的单元格,对其进行配置并将其返回到表格视图。这是一个聪明的实现,但是表视图无法在没有提示的情况下有效地重用单元,因此称为重用标识符。

最常见的方法是将重用标识符绑定到单元类。例如,如果你使用A类单元格来显示来自通讯录和B类单元格的人来显示组织,那么你显然不能将单元格B重用给人,反之亦然。在这种情况下,您可以为这两个类指定不同的重用标识符,这可以保证当您需要提供单元格A时,如果未使用的单元格A为空,该表将使单元格A出列或返回nil。

对此的自然扩展是零重用标识符。他们告诉表视图它根本不应该重用它们,当它们不再在屏幕上时释放它们。你为什么需要它?对于独特的细胞或您自己管理的细胞,或者具有非典型生命周期的细胞,或者绘制成本极高。但是,您拥有的可重复使用的单元越少,内存占用越少。