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

从官方文档:

重用标识符与表视图的委托创build的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

我不明白这一点。 那么,我明白了你创buildUITableViewCells的基本思想,并尽可能多地重复使用,而不是创build新的(或类似的东西)。 但究竟决定一个单元是否可重用呢? 如果我有两个完全相同的(可视的)单元格,但有不同的文本(我想它们不完全相同),它们都可以具有相同的标识符吗? 或者他们应该有不同的? 或者在什么情况下你应该使用不同的标识符?

任何人都可以澄清或链接到一个地方吗?

好的,这是我相信它的工作原理:

对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返回一个单元格。 所以如果一个单元格将被重用,请确保它是正确的。 这是reuseIdentifiers的用途。 通常,你只需要一个。 但是可能有一个列表使用了几种不同types的单元格,在这种情况下,您必须通过提供不同的reuseIdentifiers使它们保持分离。 否则,你可能会得到一个你认为是另一种单元格的单元格(例如,UITableView单元格而不是你想要的自定义单元格)。

所以基本上,据我了解,使用不同的重用标识符不同types的单元格,其中种类意味着类。 如果您只使用标准单元格,则可能只需要一个复用标识符。

这种devise模式被称为对象池 。

只是为了向quano添加一些非常好的答案:(我试图添加这个作为评论,但是太长了!)

即使重复使用标识符在开发过程中可以省略,但这必须在非常特定的情况下完成。 如果你有6-7个单元格的表格视图,每个单元格是不同的,你可能会发现创build一个新的单元格作为标识符可能是最好的。

有一个可重用的单元格意味着每次调用cellForRowAtIndexPath时,都必须检查单元格,如果没有可重用的单元格,请将其初始化,而在init范围之外,您必须显式地遍历所有可能的索引path,并为每个标签设置值明确地取决于你有什么样的细胞! 因此,在10个dinstinct单元格的表格视图中,如果没有,则必须注意创build单元格,并根据所创build的单元填充单元格。

因此,在这种情况下,在代码维护方面最好用零标识符来初始化每个单元(因为它不会被重用),并且适当地填充每个单元的信息,而不用担心重复使用它。

UITableView就像为每个reuseIdentifier有一个单元池,以便回收单元

我喜欢这个videohttp://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/

tmp/ezgif-3302899694.gif