每当我创建一个新单元格时,都会发生奇怪的魔法。如果我稍后退出视图控制器(所有数据都保存完毕),然后再次返回视图控制器(重新加载数据等),一切正常(但如果我留在视图控制器中,它会搞砸)
现在让我来形容这个奇怪的魔法:
但是,当创建一个新单元格时,它同时包含绿色矩形和蓝色圆圈,这怎么可能?
- (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”来打击此
您对此有何看法?
答案 0 :(得分:5)
因为单元格是从重用队列中提取的,所以它们不会被完全重绘,除非您告诉它们使用-setNeedsDisplayInRect:重绘并传入需要重绘的脏矩形。否则,当你绘制greenSquare的rect时,你需要绘制blueCircle的rect,反之亦然。
我相信正在发生的事情是过去绘制的绿色方块,在滚动屏幕后将单元格添加到重用队列中,然后将单元格从重用队列中拉出以填充新数据,然后碰巧在当前通道上绘制了蓝色圆圈,但是绘制绿色正方形的矩形从未失效并重新绘制。
答案 1 :(得分:3)
将cell.blueCircle设置为nil会将指针设置为nil,但不会删除blueCircle。由于蓝色圆圈是单元格的子视图,因此单元格具有强大的指针。您需要将其从超级视图中删除。
[cell.blueCircle removeFromSuperview];
[cell.greenRect removeFromSuperview];