我在自定义表格单元格中有自定义视图。每次更改自定义视图上的特定属性时,我都会调用[self setNeedsDisplay]
,重新绘制- (void)drawRect:(CGRect)rect
中的视图。该属性在表视图委托tableView:cellForRowAtIndexPath:
中设置。但是当表格视图大于屏幕并且必须重复使用单元格时,drawRect
每次都不会调用setNeedsDisplay
。特别是当我快速拨动桌子时。慢滚动工作正常。这导致第一个和最后一个单元格中的信息通常不正确。
在日志中我可以看到,通常情况下,每次拨打setNeedsDisplay
都会调用drawRect
,但当我快速滚动表格视图时,会有更多来电setNeedsDisplay
比drawRect
。当然,这里应该有一对一的比例。
我在普通的UIView中使用相同的自定义视图,每次调用setNeedsDisplay
时它都会重绘得很好。问题似乎与表视图和重用单元格隔离。
有谁知道这里发生了什么? 有没有其他方法可以强制自定义视图重绘自己?
答案 0 :(得分:13)
在我发现问题之前,我认为我在这个问题上挣扎了近一个星期。就是这样,我不骗你:
指向此自定义视图的指针是在.m文件而不是.h文件中定义的,使其成为类变量而不是实例变量。
是的,我非常,非常尴尬。
答案 1 :(得分:7)
setNeedsDisplay
只有在视图可见时才会调用drawRect:
,否则会使视图图层无效,并且当drawRect:
变为可见时会调用drawRect:
。
当滚动表格视图时,表格视图将请求单元格,希望将它们添加到视图中。如果滚动速度足够快,一些单元格将花费很长时间来准备,并且当它们准备好时,它们应该定位的位置是在屏幕外。在这些情况下,表视图会丢弃它们,而不是将它们添加到滚动视图中(因此不会调用{{1}})
答案 2 :(得分:1)
您应该调用[_table_ reloadData]
来重绘表格。不是[_table_cell_ setNeedsDsiplay]
答案 3 :(得分:0)
听起来有两种情况可以刷新视图:如果内部值发生更改(并且您调用[self setNeedsDisplay]
强制更新),以及表视图是否请求绘制单元格(或者重复使用)。在这种情况下,您没有明确地重新绘制该自定义视图。
根据文件:
tableView中的表视图委托:cellForRowAtIndexPath:在重用单元格时总是重置所有内容。
如果tableview正在回收单元格,它将返回旧值仍然存在的单元格。您可以确保更新内容。根据您设置自定义表格单元格的方式,您可能需要做更多工作以确保视图处于最新状态,但最简单的方法是在自定义表格单元格处理程序中强制调用[myCustomView setNeedsDisplay]
。 / p>