【问题标题】:How do I create rows with alternating colors for a UITableView on iPhone?如何在 iPhone 上为 UITableView 创建具有交替颜色的行?
【发布时间】:2011-02-03 21:18:39
【问题描述】:

我会交替使用 2 种颜色的行,例如第一个黑色、第二个白色、第三个黑色等...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]);
if (cell==nil) {

    NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"MainCell"    owner:self options:nil];

    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            if ((indexPath.row % 2)==0) {
                [cell.contentView setBackgroundColor:[UIColor purpleColor]];

            }else{
                [cell.contentView setBackgroundColor:[UIColor whiteColor]];

            }
            cell =  (MainCell *) currentObject;
            break;
        }
    }

}else {

    AsyncImageView* oldImage = (AsyncImageView*)
    [cell.contentView viewWithTag:999];
    [oldImage removeFromSuperview];
}return cell;

问题是,当我快速滚动时,单元格的背景变得像最后 2 个单元格黑色,前 2 个单元格白色或类似的东西,但如果我滚动缓慢工作正常。 我认为问题在于reusableCell的缓存。

有什么想法吗?

TIA

【问题讨论】:

  • 如果您将 CellIdentifier 设置为字符串文字,请不要将其设为静态
  • @Jared P:将指向字符串文字的指针设为静态并没有错。
  • 我仍然认为在 java 中!..但是对于我所知道的静态标识符,对象的值在第一次分配时保持不变......
  • @Mat:是的,它将在函数的自动范围之外分配。在这种情况下,它可能无关紧要,但使用 static 并没有什么问题,而且它无论如何都在 Apple 样板中使用。
  • 我相信在这种情况下将其设为静态可以加快速度。在出队代码中,当比较重用标识符的相等性时,如果使用静态字符串,则指针将匹配,这意味着它不必继续进行更昂贵的字符串比较。这可能是一个微不足道的好处,但我敢打赌这就是他们这样做的原因。

标签: ios objective-c uitableview cocoa-touch cell


【解决方案1】:

我相信正在发生的事情是,当您将可重复使用的单元格出列时,您并没有按照定义的顺序执行此操作。正如它会发生的那样,当您缓慢滚动时,单元格一次变为一个可用,并按顺序排列给您。当您快速滚动时,顺序变得未定义,它们出列的顺序也是如此。我相信这就是为什么(在很大程度上)苹果设计 UITableView API 以通过标识符出列 - 这样您就可以轻松地重用不同类型的单元格,例如具有不同颜色的单元格。因此,我建议修改代码,让每个单元格颜色都有自己的标识符。 (此外,如果可能的话,有一个出口将这个 tableview 数据源直接连接到单元格,或者在加载一次后将其保存在 ivar 中,然后复制它而不是循环通过高级对象)

【讨论】:

  • 不要这样做。如果你只是改变背景颜色,它就像单元格内容,所以使用相同的标识符。如果您有不同的单元格排列或其他内容,您将使用不同的标识符。你通过使用不同的标识符来浪费资源。
  • 喜欢 2 个具有 2 个不同标识符的 nib 文件?
  • @Mat:如果您的单元格有不同的布局,您将使用不同的标识符。所以是的,如果你有两个基于完全不同的内容加载的笔尖。在这种情况下,您不想意外找回错误类型的单元格。但是您不能将其用于简单的更改,例如背景颜色或其他任何内容。
  • 在这种特殊情况下,您最多只会在表格的生命周期内加载额外的两个单元格,所以这不会是一个巨大的成本。此外,只有在我建议单元格以不同的方式加载(而不是从笔尖加载)之后,这才可以接受,因为它会极大地降低创建成本。话虽如此,你的答案绝对更好。
【解决方案2】:

单元格被回收(这就是您将它们出列并检查它是否为 nil 时所做的事情)。因此,不要在创建单元格时设置背景颜色,而是在之后的某个时间设置它。所以:

if( !cell ) {
  // create the cell and stuff
}
if( [indexPath row] % 2)
  [cell setBackgroundColor:[UIColor whiteColor]];
else
  [cell setBackgroundColor:[UIColor purpleColor]];

【讨论】:

  • 这种方法对我不起作用。在尝试了各种各样的事情之后,使其工作的唯一方法是对不同颜色的单元格使用不同的重用标识符。
  • 不能在 cellForRowAtIndexPath 中设置单元格背景。您可以在 willDisplayCell 方法中设置它。
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2014-12-22
相关资源
最近更新 更多