1

每当我创建一个新单元格时,就会出现奇怪的魔法。如果我稍后退出视图控制器(数据全部保存),然后再次返回视图控制器(重新加载数据等),一切都很好(但如果我留在视图控制器中,它就会搞砸)

现在让我来描述一下这个奇怪的魔法:

  • 我有一个自定义 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”来解决这个问题。

您对此有何看法?

4

2 回答 2

5

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

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

于 2013-04-14T05:19:20.047 回答
3

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

[cell.blueCircle removeFromSuperview];
[cell.greenRect removeFromSuperview];
于 2013-04-14T05:23:04.327 回答