向UITableViewCell的IBOutlet添加UIView后界面未即时更新如何解决?
问题原因
- 你在
cellForRowAt里每次重用cell都新增一个progressBar子视图,没有清理旧的视图,会导致视图层级冗余,而且新增视图后没有主动触发容器的布局刷新,首次渲染时系统没有及时把新添加的视图绘制出来。 progressContainerView在cellForRowAt调用时还未完成自动布局计算,你写死的frame可能在首次渲染时没有生效,等cell滑出再滑入重新走布局流程后才会正常显示。- 你的代码存在笔误:最后return的是未定义的
cell变量,实际你定义的cell变量是stockCell,也会导致异常。
修复方案
方案1:将进度条封装到自定义Cell内部(推荐)
把progressBar作为customStockCell的内置属性,在cell初始化阶段完成添加和布局,避免每次复用重复创建视图:
class customStockCell: UITableViewCell { @IBOutlet var progressContainerView: UIView! // 内部封装进度条 let progressBar = UIView() override func awakeFromNib() { super.awakeFromNib() // 初始化时就添加到容器中 progressBar.backgroundColor = .green progressContainerView.addSubview(progressBar) // 使用自动布局替代死frame,规避布局计算时机问题 progressBar.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ progressBar.leadingAnchor.constraint(equalTo: progressContainerView.leadingAnchor), progressBar.topAnchor.constraint(equalTo: progressContainerView.topAnchor), progressBar.widthAnchor.constraint(equalToConstant: 100), progressBar.heightAnchor.constraint(equalToConstant: 100) ]) } }
对应的cellForRowAt简化为:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let stockCell = tableView.dequeueReusableCell(withIdentifier: "stockCell", for: indexPath) as! customStockCell // 后续需要修改进度条样式/宽度直接操作stockCell.progressBar即可 return stockCell }
方案2:必须在cellForRow添加视图的临时修复
如果业务逻辑需要在cellForRow中动态添加视图,需要先清理容器旧子视图,添加完成后强制触发布局刷新:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let stockCell = tableView.dequeueReusableCell(withIdentifier: "stockCell", for: indexPath) as! customStockCell // 先清理旧的子视图,避免重复叠加 stockCell.progressContainerView.subviews.forEach { $0.removeFromSuperview() } let progressBar = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) progressBar.backgroundColor = .green stockCell.progressContainerView.addSubview(progressBar) // 强制容器立刻执行布局 stockCell.progressContainerView.layoutIfNeeded() return stockCell }
内容的提问来源于stack exchange,提问作者dub
相关产品推荐
相关产品推荐

