如何为iPhone上的UITableView创建交替颜色的行?

时间:2010-04-02 21:33:03

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

我会有另外两种颜色的行,比如第一个黑色,第二个白色,第三个黑色等等......

- (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

2 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:2)

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