qua*_*ano 50 iphone objective-c uitableview reuseidentifier
从官方文档:
重用标识符与表视图的委托创建的UITableViewCell对象相关联,其目的是将其作为表视图的多行的基础(出于性能原因)重用.它在initWithFrame:reuseIdentifier:中分配给单元对象,此后不能更改.UITableView对象维护当前可重用单元的队列(或列表),每个单元都有自己的重用标识符,并使它们可用于dequeueReusableCellWithIdentifier:方法中的委托.
我不明白这一点.嗯,我理解我认为你创建UITableViewCells的基本思想,并尝试尽可能多地重用,而不是创建新的(或类似的东西).但究竟是什么决定一个细胞是否可以重复使用?如果我有两个相同的(视觉)单元格,但有不同的文本(我认为它们不完全相同),它们是否都具有相同的标识符?或者他们应该有不同的?或者在什么情况下你应该使用不同的标识符?
任何人都可以澄清或链接到它的位置吗?
qua*_*ano 66
好的,这就是我相信它的工作原理:
使用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");
}
Run Code Online (Sandbox Code Playgroud)
请记住,只有dequeueReusableCellWithIdentifier才能返回适用的单元格.因此,如果要重复使用一个单元格,请确保它对于该情况是正确的.这就是reuseIdentifiers的用途.通常,您只需要一个.但是可能存在使用几种不同类型的单元格的列表,在这种情况下,您必须通过提供不同的reuseIdentifier来将它们分开.否则,您可能最终得到一个您视为其他类型单元格的单元格(例如,UITableView单元格而不是您想要的自定义单元格).
基本上,据我所知,对不同类型的单元格使用不同的reuseIdentifier,其中kind表示类.如果您只使用标准单元格,则可能只需要一个reuseIdentifier.
此设计模式称为对象池.
cso*_*iou 10
只是添加一些东西给quano的非常好的答案:(我试着把它添加为评论,但它太长了!)
在开发过程中甚至可以省略重用标识符,尽管这必须在非常特定的情况下完成.如果您有6-7个单元格的表视图,并且每个单元格不同,您可能会发现创建一个以nil作为标识符的新单元格可能更为可取.
拥有可重用的单元意味着在每次调用cellForRowAtIndexPath时,必须检查单元格,如果没有可重用的单元格则初始化它,并且在init范围之外,您必须显式遍历所有可能的索引路径并设置每个标签的值明确取决于你有什么样的细胞!因此,在具有10个dinstinct单元格的表格视图中,如果为nil,则必须注意创建单元格,并根据您创建的内容填充它.
因此,在这种情况下,在代码维护方面,最好使用nil标识符初始化每个单元格(因为它不会被重复使用)并且适当地填充每个单元格的信息而不必担心重复使用它.
归档时间: |
|
查看次数: |
31712 次 |
最近记录: |