UITableView中的最佳实践与不同类型的UITableViewCell

时间:2013-08-30 10:48:53

标签: iphone ios uitableview reuseidentifier

她是我们需要做的:

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

我们有3个解决方案:

  1. 使用具有唯一重用标识符的唯一tableViewCell。
  2. 使用具有5个重用标识符的唯一tableViewCell。
  3. 使用5个tableViewCell和5个重用标识符。
  4. 我们测试第一个解决方案,它在iphone 5 / iphone 4S中没问题,但在iphone 4中它是slooooooow(我们也需要支持3GS ......)。

    问题:哪种解决方案会更好?或者,如果你有其他解决方案,它会很棒。

    赞成:你能解释一下重用标识符是如何工作的(详见请:)),比如分配第一个单元格,重用它们时(带有1和不同的重用标识符),当它们被解除分配时... 。?

    谢谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这是我的解决方案,它在3gs上运行正常,现在取决于你的细胞有多复杂以及你做了多少事情@ [cell load]方法。尽量避免使用/ 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;
    }

......等等