我会有另外两种颜色的行,比如第一个黑色,第二个白色,第三个黑色等等......
- (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
答案 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中,然后复制它而不是循环通过高级对象)