UIView drawRect 仅在 UITableViewCell 中调用一次,导致重新使用单元格时数据过时

Posted

技术标签:

【中文标题】UIView drawRect 仅在 UITableViewCell 中调用一次,导致重新使用单元格时数据过时【英文标题】:UIView drawRect only called once in UITableViewCell resulting in stale data when cells are re-used 【发布时间】:2016-10-24 02:23:15 【问题描述】:

我有一个 UITableViewCell,其中包含我创建的自定义 UIView(以及其他一些东西)。我的自定义视图扩展了 UIView,并覆盖了一些自定义绘图的 drawRect。

最初加载每个单元格时,我的表格视图会正确呈现,但是当我滚动浏览表格单元格时,正在重新使用它们,并且不会为它们重新调用自定义 UIView.drawRect 方法。这会导致 tableview 中的单元格使用陈旧的 UIView。

我做错了吗?我尝试在 tableview 单元格上设置setNeedsDisplay,但这不起作用。

【问题讨论】:

【参考方案1】:

原来我在UITableViewCell 上打电话给setNeedsDisplay。当我在表格视图单元格内的自定义 UIView 上调用它时,它可以工作。

【讨论】:

【参考方案2】:

我在 cellForRowAt 中调用它,它设法更新了我放在里面的自定义 Tableview UIView 上的图表。

代码如下:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
// this is cast AS! ErgWorkoutCell since this is a custom tableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "ergWorkoutCell") as? ErgWorkoutCell

cell?.ergWorkoutTitle.text = jsonErgWorkouts[indexPath.row].title
cell?.ergWorkoutTime.text = String(FormatDisplay.time(Int(jsonErgWorkouts[indexPath.row].durationMin * 60)))


cell?.ergLineChartView.setNeedsDisplay()


return cell!

  

【讨论】:

以上是关于UIView drawRect 仅在 UITableViewCell 中调用一次,导致重新使用单元格时数据过时的主要内容,如果未能解决你的问题,请参考以下文章

调用 setFrame 时不调用 drawRect

加速 -drawRect: UIView 子类的方法

使用drawrect自定义UIView动画

UIView 在后台调用 drawRect

如何在drawRect中获取UIView大小

UIView的layoutSubviews和drawRect方法何时调用