首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iPhone -什么是reuseIdentifiers (UITableViewCell)?

iPhone -什么是reuseIdentifiers (UITableViewCell)?
EN

Stack Overflow用户
提问于 2010-01-28 11:50:46
回答 3查看 32K关注 0票数 50

来自官方文档:

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-16 07:36:26

好吧,这就是我认为它是如何工作的:

在tableView上使用dequeueReusableCellWithIdentifier可以大大提高速度。不需要实例化许多单元格,只需实例化所需的数量,即可见的数量(这是自动处理的)。如果滚动到列表中的某个区域,其中有尚未获得其可视化表示的“单元格”,则不是实例化新的单元格,而是重用已有的单元格。

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

代码语言:javascript
复制
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

票数 67
EN

Stack Overflow用户

发布于 2012-08-17 19:07:55

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

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

拥有可重用的单元格意味着在每次调用cellForRowAtIndexPath时,您必须检查该单元格,如果没有可重用的单元格,则对其进行初始化,并且在init作用域之外,必须显式迭代所有可能的索引路径,并根据您拥有的单元格的类型显式地设置每个标签的值!因此,在包含10个本能单元格的表视图中,如果没有创建单元格,则必须注意创建单元格,并根据创建的内容填充单元格。

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

票数 10
EN

Stack Overflow用户

发布于 2016-04-17 05:14:01

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2152180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档