【问题标题】:Best practice in UITableView with different kind of UITableViewCellUITableView 的最佳实践与不同类型的 UITableViewCell
【发布时间】:2013-08-30 10:48:53
【问题描述】:

她是我们需要做的:

  • tableView核心数据的数据源。
  • 一个包含 5 种不同类型的自定义 tableViewCell 的 tableView。
  • 每个 tableViewCell 都与其他的完全不同。
  • 某些 tableViewCell 会有一个 progressBar。

我们有 3 个解决方案:

  1. 使用具有唯一重用标识符的唯一 tableViewCell。
  2. 使用具有 5 个重用标识符的唯一 tableViewCell。
  3. 使用 5 个 tableViewCell 和 5 个重用标识符。

我们测试了第一种解决方案,在 iphone 5/iphone 4S 上没问题,但在 iphone 4 上就慢了(我们也需要支持 3GS ...)。

问题:哪种解决方案会更好?或者如果您有其他解决方案,那就太好了。

这个好处:你能解释一下重用标识符是如何工作的(请详细说明:)),比如第一个单元何时被分配,它们何时被重用(使用 1 和不同的重用标识符),当它们被解除分配时...... . ?

谢谢。

【问题讨论】:

  • 解决方案 2 我已经尝试过它的真棒
  • @SARFARAZKHAN 非常有趣,它是如何工作的?

标签: iphone ios uitableview reuseidentifier


【解决方案1】:

如果所有单元格完全不同(布局),您应该使用唯一的重用标识符初始化每个单元格类型,以便稍后从出队单元格的性能优势中受益。表格视图将根据需要初始化尽可能多的单元格(取决于每个部分中的部分和行数)以填充其边界,无论您分配哪个重用标识符。单元格在从 tableview 的可见区域消失时被缓存。这意味着每个已离开屏幕的重用标识符的至少一个单元格被保存在内存中以供重用。当滚动表格视图并且需要另一行时,它将要求 cellForRowAtIndexPath 为该行提供一个单元格。当队列中没有具有指定重用标识符的单元格时,将创建一个新单元格,初始化子视图并完成子视图的布局/排列。如果缓存中有一个具有指定重用标识符的单元格,则 tableview 会“按原样”获取此单元格,并根据您在 cellForRowAtIndexPath 中提供的规范对其进行自定义,例如为 imageView 分配不同的图像或设置标签的文本,这更多“便宜”而不是创建一个全新的细胞。您可以通过仅在自定义单元格的 initWithStyle 中设置标签文本来检查这一点。如果在 cellForRowAtIndexPath 中调用 dequeueReusableCellWithIdentifier 后不修改文本,则标签的文本在每个具有相同重用标识符的出列单元中都是相同的。复杂的背景(例如渐变)也将被重复使用,并且不需要在每次屏幕上出现新单元格时重新绘制。将一个重用标识符分配给所有不同类型的单元格,重用单元格将导致与为每一行创建一个新单元格几乎相同的工作(假设每种单元格类型均等分布)。当 tableview 被释放时,队列中的单元格将被释放。希望这可以帮助您理解重用 tableview 单元格的概念。

【讨论】:

    【解决方案2】:

    这是我的解决方案,它在 3gs 上运行良好,现在取决于您的单元有多复杂以及您在 @[单元加载] 方法中做了多少事情。尽量避免那里的 for/while 循环。

        if(indexPath.row == 0){
    
            static NSString *CellIdentifier = @"HeadCell";
            kHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            [cell load];
            return cell;
        }
        if(indexPath.row == 1){
             static NSString *CellIdentifier = @"HistCell";
             kHisoryCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            [cell load];
            return cell;
        }
    

    ...等等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2012-11-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多