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

问题描述:

从官方文件:iPhone - 什么是重用标识符(UITableViewCell)?

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

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

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

使用dequeueReusableCellWithIdentifier为的tableView,可以大大加快速度。您可以根据需要实例化多个单元格,而不是实例化很多单元格,即可以看到多个单元格(这是自动处理的)。如果滚动到列表中存在尚未得到其可视化表示的“单元格”的区域,而不是实例化新单元格,则可以重用已存在的单元格。

你可以这样做自己试用:

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的用途。通常,你只需要一个。但是可能有一个列表使用了几种不同类型的单元格,在这种情况下,您必须通过提供不同的reuseIdentifiers来使它们保持分离。否则,你最终可能会得到一个你认为是其他类型的单元格的单元格(例如,UITableView单元格而不是你想要的自定义单元格)。

所以基本上,据我所知,使用不同的reuseIdentifiers不同类型的单元格,其中kind意味着类。如果您只使用标准单元格,则可能只需要一个reuseIdentifier。

这种设计模式被称为object pooling

+14

我一直在开发iPhone很长一段时间,磕磕绊绊这个视频在这个答案很多澄清了这个话题。 – 2010-11-21 17:27:51

+0

很好的解释:) – Karun 2014-09-16 06:51:26

+0

对象池正确的术语之一upvote那 – Shajo 2015-03-11 14:31:00

我想补充一些东西quano的,否则很好的答案:(我尝试添加为评论,但它是太长了!)

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

拥有可重复使用的单元格意味着每次调用cellForRowAtIndexPath时,都必须检查单元格,如果没有可重用单元格,则初始化该单元格,并且在init范围之外,必须明确地遍历所有可能的索引路径并设置每个标签的值明确取决于您拥有的细胞种类!因此,在10个dinstinct单元格的表格视图中,如果为零,则必须注意创建单元格,并根据创建的内容填充单元格。

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

的UITableView就像有每个reuseIdentifier一个细胞库,使其回收电池

我喜欢http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/

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