来自官方文档:
重用标识符与一个UITableViewCell对象相关联,该对象是表视图的委托创建的,目的是重用该对象作为表视图多行的基础(出于性能原因)。它被分配给initWithFrame:reuseIdentifier:中的cell对象,此后不能更改。UITableView对象维护当前可重用单元格的队列(或列表),每个单元格都有自己的重用标识符,并在dequeueReusableCellWithIdentifier:方法中使它们可供委托使用。
我不明白这个。嗯,我理解基本的想法,我认为,你创建UITableViewCells,并尝试尽可能多地重用,而不是创建新的(或类似的东西)。但是,到底是什么决定了单元是否可重用呢?如果我有两个相同(视觉上)的单元格,但具有不同的文本(好吧,我认为它们不是完全相同的),它们能有相同的标识符吗?或者他们应该有不同的选择?或者在什么情况下应该使用不同的标识符?
任何人可以澄清或链接到它所在的地方吗?
发布于 2010-02-16 07:36:26
好吧,这就是我认为它是如何工作的:
在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的作用。通常,您只需要一个。但是可能有一个列表使用了几种不同类型的单元格,在这种情况下,您必须通过提供不同的reuseIdentifiers来将它们分开。否则,您最终可能会得到一个被视为其他类型的单元格(例如,UITableView单元格而不是您想要的自定义单元格)。
所以基本上,根据我的理解,对不同类型的单元使用不同的reuseIdentifiers,其中kind表示类。如果只使用标准单元格,则可能只需要一个reuseIdentifier。
这种设计模式称为object pooling。
发布于 2012-08-17 19:07:55
只是在quano的其他非常好的答案中添加一些东西:(我试图将此作为评论添加,但它太长了!)
甚至可以在开发过程中省略重用标识符,尽管这必须在非常特定的情况下完成。如果您有一个包含6-7个单元格的表视图,并且每个单元格都是不同的,您可能会发现创建一个以nil作为标识符的新单元格可能更可取。
拥有可重用的单元格意味着在每次调用cellForRowAtIndexPath时,您必须检查该单元格,如果没有可重用的单元格,则对其进行初始化,并且在init作用域之外,必须显式迭代所有可能的索引路径,并根据您拥有的单元格的类型显式地设置每个标签的值!因此,在包含10个本能单元格的表视图中,如果没有创建单元格,则必须注意创建单元格,并根据创建的内容填充单元格。
因此,在这种情况下,在代码维护方面,最好用nil标识符初始化每个单元格(因为它无论如何都不会被重用),并适当地填充每个单元格的信息,而不用担心重用它。
发布于 2016-04-17 05:14:01
UITableView就像每个reuseIdentifier
都有一个单元池,这样它就可以回收单元
我喜欢这段来自http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/的视频
https://stackoverflow.com/questions/2152180
复制相似问题