TableView给Cell赋值时layoutSubviews内变量重复调用两次如何解决
问题原因
layoutSubviews 是UIKit的原生生命周期方法,会被系统在多种场景下自动触发,并不只在你给count属性赋值时调用:包括cell被添加到父视图、cell滚动复用、系统自动调整布局(比如安全区域变更、自动布局约束更新、cell高度动态调整)都会触发该方法,所以才会出现相同count打印多次的情况。而dataSource方法仅在cell每次加载/复用时调用一次,所以打印结果符合预期。
解决方案
- 方案1(最推荐):将依赖
count的业务逻辑迁移到count的属性观察器中,仅在count赋值变更时触发逻辑,完全避免重复执行。修改你的TableViewCell属性代码如下:
var count: Int! { didSet { // 把你原来写在layoutSubviews里、依赖count的逻辑放到这里 // 比如更新子控件布局、修改文本显示等 print(count) } }
你在dataSource中赋值一次count,didSet就只会执行一次,输出结果和dataSource内的打印完全一致。
- 方案2:如果你的逻辑必须放在
layoutSubviews中才能执行,可以新增标记位控制执行次数:
// 新增私有标记位 private var isCountProcessed = false var count: Int! { didSet { // count更新后重置标记位,允许新值的逻辑执行 isCountProcessed = false } } override func layoutSubviews() { super.layoutSubviews() // 已经处理过当前count的逻辑就直接跳过 guard !isCountProcessed else { return } // 这里执行依赖count的逻辑 print(count) // 执行完标记为已处理,后续layoutSubviews触发不会重复执行 isCountProcessed = true }
- 额外注意点:如果你的cell支持复用,要在
prepareForReuse方法中重置count和相关标记位,避免复用旧数据导致显示异常。
内容的提问来源于stack exchange,提问作者JaeKyeong
相关产品推荐
相关产品推荐

