UITableViewCell 子视图在重绘之前不显示

Posted

技术标签:

【中文标题】UITableViewCell 子视图在重绘之前不显示【英文标题】:UITableViewCell subview not displaying until redraw 【发布时间】:2012-02-08 16:16:43 【问题描述】:

这个问题把我逼疯了。

我的故事板中有一个原型 UITableViewCell。它包含一堆子视图。其中一个子视图 UILabel 行为不端。

当表格视图第一次加载并显示时,所有的单元格看起来都很好。但是,随着 tableview 向下滚动,最终其中一个单元格显示没有 UILabel 子视图。似乎它总是第一个被回收的细胞。

但是,如果我继续向下滚动 tableview,一旦行为不端的单元格被 tableview 的顶部剪裁(当它开始从屏幕顶部滚动时),标签就会按原样显示。

所以标签似乎在那里,它接收我在我的 cellForRowAtIndexPath 方法中分配给它的字符串。只是由于某种原因没有被绘制。我尝试在不同的地方插入 setNeedsDisplay 消息,但没有帮助。

同样奇怪的是,我在不同视图控制器的情节提要中使用相同的 UITableViewCell 子类和重复的视图层次结构,我没有任何问题。

有人知道我该如何开始解开这个谜团吗?

谢谢!

【问题讨论】:

在 tableView:cellForRowAtIndexPath 中初始化后,是否正在修改表格单元格或任何子视图? 我是。我正在设置标签的文本,并使用其他自定义 UIView 子类做一些其他事情。所有这些工作正常。只是 UILabel 没有被绘制出来。 我遇到了非常相似的事情。在一个特定的单元格上,不会绘制一个标签。如果我中断代码,单元格看起来绝对没问题。如果我做 setNeedsDisplay,它就会出现。快把我逼疯了! 【参考方案1】:

听起来只有当您使用可重用单元格时才会出现问题,这意味着在您准备好滚动之前,可重用单元格上的值可能不会被设置。

【讨论】:

我知道该值被设置之前单元格出现在屏幕上,因为所有其他子视图都已正确配置。只是没有绘制的标签。当标签确实出现时,它的文本值是正确的,因此在单元格出现在屏幕上之前,该值似乎已与所有其他值一起设置。不确定您推荐的解决方案是什么…… 我唯一能想到的另一件事是标签的视图没有添加为子视图,否则您可能需要发布您的 cellForRowAtIndexPath 代码。

以上是关于UITableViewCell 子视图在重绘之前不显示的主要内容,如果未能解决你的问题,请参考以下文章

在重绘屏幕之前,如何阻止 iPhone 显示变换更改

“onscroll”在重绘之后还是之前触发?

SwiftUI:ObservableObject 在重绘时不会保持其状态

TabView 在重绘时是不是会错过导航点击?

为啥我必须删除为 UITableViewCell 添加的子视图,而不是在 UITableViewCell 的子类中?

UITableViewCell 子视图不遵守自动布局约束