iPhone - 重用标识符是什么(UITableViewCell)?

51

从官方文档中得知:

重用标识符是与UITableViewCell对象关联的,该对象是表视图的委托创建的,旨在将其作为多行表视图的基础(出于性能原因)进行重复使用。 它在initWithFrame:reuseIdentifier:中分配给单元格对象,之后不能更改。 UITableView对象维护当前可重复使用的单元格的队列(或列表),每个都有自己的重用标识符,并通过dequeueReusableCellWithIdentifier:方法提供给委托。

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

我不太理解这个。 好吧,我明白基本的想法,我想,你创建UITableViewCells,并尝试尽可能多地重用它们而不是制作新的(或类似的东西)。 但是是什么决定了一个单元格是否可重用呢? 如果我有两个相同的(在视觉上)单元格,但具有不同的文本(嗯,我认为它们并不完全相同),它们可以都具有相同的标识符吗? 还是它们应该有不同的标识符? 或者在什么情况下应该使用不同的标识符?

有人可以澄清一下,或链接到一个可以介绍这个的地方吗?

3个回答

68

好的,我认为它是这样工作的:

使用tableView的dequeueReusableCellWithIdentifier功能可以大大加速操作。不用实例化大量单元格,只需实例化所需数量,即可见的数量(这是自动处理的)。如果滚动到列表中还没有视觉表示的“单元格”区域,而不是实例化新的单元格,您可以重复使用已经存在的单元格。

您可以通过执行以下操作来自己尝试:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSLog(@"new one");
}
else
{
    NSLog(@"old one");
}

记住,只有当一个单元格适用时,你才希望'dequeueReusableCellWithIdentifier'返回它。因此,如果一个单元格将要被重用,请确保它对于当前情况是正确的。这就是重用标识符的作用。通常,你只需要一个。但是可能会有一个使用了几种不同类型的单元格的列表,在那种情况下,你需要通过提供不同的重用标识符来将它们分开。否则,你可能会得到一个你将其视为其他类型的单元格(例如,UITableView单元格而不是你想要的自定义单元格)。

所以基本上,我的理解是,对于不同类型的单元格,使用不同的重用标识符,其中“类型”表示类。如果你只使用标准单元格,你可能只需要一个重用标识符。

这种设计模式被称为对象池


15
我已经开发 iPhone 很长时间了,而这个答案让我对这个主题有了更清晰的理解。 - please delete me
什么是restorationIdentifier? - Syed Ali Salman

10

补充一下quano非常好的回答:即使复用标识符可以在开发中省略,但必须在非常特定的情况下才能这样做。如果您有一个包含6-7个单元格的表视图,并且每个单元格都不同,您可能会发现创建一个新单元格并将标识符设置为nil可能更可取。

拥有可重用单元格意味着每次调用cellForRowAtIndexPath时,您都必须检查单元格,如果没有可重用单元格则对其进行初始化,在init作用域之外,您必须显式遍历所有可能的indexPaths并根据您创建的单元格类型明确地为每个标签设置值!因此,在具有10个不同单元格的表视图中,您将需要注意如果为nil,则创建单元格,并根据所创建的内容填充它。

因此,在这种情况下,为了便于维护代码,最好使用nil标识符初始化每个单元格(因为无论如何都不会重用它),并适当地填充每个单元格的信息,而不必担心重新使用它。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接