UITableViewCell将是DisDisplayCell方法的难题

时间:2013-04-14 05:10:36

标签: ios objective-c cocoa-touch uitableview

每当我创建一个新单元格时,都会发生奇怪的魔法。如果我稍后退出视图控制器(所有数据都保存完毕),然后再次返回视图控制器(重新加载数据等),一切正常(但如果我留在视图控制器中,它会搞砸)

现在让我来形容这个奇怪的魔法:

  • 我有自定义UITableViewCell
  • 当indexPath为偶数时,其中存在蓝色圆圈
  • 当indexPath为奇数时,其中存在绿色矩形

但是,当创建一个新单元格时,它同时包含绿色矩形和蓝色圆圈,这怎么可能?

- (void)tableView:(UITableView *)tableView willDisplayCell:(CustomCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (cell.blueCircle)    cell.blueCircle = nil;
    if (cell.greenRect)   cell.greenRect = nil;    
    if (indexPath.row % 2 == 0){
        NSLog(@"Even indexPath: %@", indexPath);
        //some of the code not shown here creates a blue circle
        [cell addSubview:cell.blueCircle];
    }
    else {
        NSLog(@"Odd indexPath: %@", indexPath);
        //some of the code not shown here creates a green rectangle
        [cell addSubview:cell.greenRect];
    } 
}

请注意,我只获得一个NSLog,无论是奇数还是偶数,所以为什么我得到两个形状而不是一个?

我有一种感觉,在调用此消息之前,其中一个形状会以某种方式(不确定这是如何工作的)从前一个单元格转移到新单元格,但我确实有懒惰的“nilization”来打击此

您对此有何看法?

2 个答案:

答案 0 :(得分:5)

因为单元格是从重用队列中提取的,所以它们不会被完全重绘,除非您告诉它们使用-setNeedsDisplayInRect:重绘并传入需要重绘的脏矩形。否则,当你绘制greenSquare的rect时,你需要绘制blueCircle的rect,反之亦然。

我相信正在发生的事情是过去绘制的绿色方块,在滚动屏幕后将单元格添加到重用队列中,然后将单元格从重用队列中拉出以填充新数据,然后碰巧在当前通道上绘制了蓝色圆圈,但是绘制绿色正方形的矩形从未失效并重新绘制。

答案 1 :(得分:3)

将cell.blueCircle设置为nil会将指针设置为nil,但不会删除blueCircle。由于蓝色圆圈是单元格的子视图,因此单元格具有强大的指针。您需要将其从超级视图中删除。

[cell.blueCircle removeFromSuperview];
[cell.greenRect removeFromSuperview];