50

来自官方文档:

重用标识符与表视图的委托创建的 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,并尝试尽可能多地重用,而不是创建新的(或类似的东西)。但是究竟是什么决定了一个细胞是否可重复使用呢?如果我有两个相同(视觉上)的单元格,但文本不同(我想它们并不完全相同),它们是否可以具有相同的标识符?或者他们应该有不同的?或者在什么情况下你应该使用不同的标识符?

任何人都可以澄清或链接到它所在的地方吗?

4

3 回答 3

67

好的,这就是我认为它的工作原理:

对 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 单元格而不是您想要的自定义单元格)。

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

这种设计模式称为对象池

于 2010-02-15T23:36:26.020 回答
10

只是为了在 quano 的其他非常好的答案中添加一些东西:(我试图将其添加为评论,但它太长了!)

即使在开发过程中也可以省略重用标识符,尽管这必须在非常特定的情况下完成。如果您有一个包含 6-7 个单元格的表格视图,并且每个单元格都不同,您可能会发现创建一个以 nil 作为标识符的新单元格可能更可取。

拥有可重用单元意味着在每次调用 cellForRowAtIndexPath 时,您必须检查单元,如果没有可重用单元则初始化它,并且在初始化范围之外,您必须显式迭代所有可能的索引路径并设置每个标签的值明确取决于您拥有的细胞类型!因此,在具有 10 个不同单元格的表格视图中,如果为 nil,您将必须注意创建单元格,并根据您创建的内容填充它。

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

于 2012-08-17T11:07:54.863 回答
2

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

我喜欢这个来自http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/的视频

http://im.ezgif.com/tmp/ezgif-3302899694.gif

于 2016-04-16T21:14:01.473 回答