【问题标题】:iPhone - What are reuseIdentifiers (UITableViewCell)?iPhone - 什么是重用标识符 (UITableViewCell)?
【发布时间】:2011-01-10 06:22:06
【问题描述】:

来自官方文档:

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

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

【问题讨论】:

    标签: iphone objective-c uitableview reuseidentifier


    【解决方案1】:

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

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

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

    这种设计模式被称为object pooling

    【讨论】:

    • 我已经开发 iPhone 很长时间了,偶然发现这个答案澄清了这个话题。
    • 什么是restoreIdentifier
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      UITableView 就像为每个reuseIdentifier 设置了一个cell pool,这样它就可以回收cell

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多