UICollectionViewCell复用状态异常 prepareForReuse用法咨询
问题结论
你的prepareForReuse方法的调用写法本身是符合规则的(调用super方法后执行重置逻辑的时机没有问题),但单元格复用后样式错乱的核心原因是你的setDefault()重置逻辑不全,没有覆盖所有被setBlueColor()修改过的属性,和prepareForReuse的调用方式无关。
具体问题点
你可以对比两个样式方法修改的属性:
setBlueColor()一共修改了5个样式属性:viewCard.backgroundColor设为蓝色viewCard.layer.borderWidth设为0viewCard.layer.borderColor设为透明viewCard阴影样式lblCategory.textColor设为白色
- 但是你的
setDefault()方法只重置了圆角、边框宽度、边框颜色、阴影这4个属性,完全没有重置卡片背景色、label文字颜色这两个属性。
单元格复用时,之前被设为蓝色状态的cell即使调用了setDefault(),残留的蓝色背景、白色文字属性也不会被清除,自然会出现非首项单元格显示蓝色样式的问题。
修复方案
补全setDefault()方法里的属性重置,把所有被选中状态修改过的属性都恢复为默认值即可,参考修改:
func setDefault() { viewCard.layer.cornerRadius = 15 viewCard.layer.borderWidth = 1 viewCard.layer.borderColor = UIColor.lightGray.cgColor // 补全:重置卡片默认背景色(替换为你项目里的默认背景色即可) viewCard.backgroundColor = .white // 补全:重置label默认文字颜色(替换为你项目里的默认文字色即可) lblCategory.textColor = .darkText viewCard.setviewShadowCustomInputs(shadowColor: UIColor.clear.cgColor, shadowOpacity: 0, shadowRadius: 0, shadowWidth: 0, shadowHeight: 0) }
额外注意点
你在cellForItemAt方法里取数据源用的是tableSctionHeader数组,但updateCollectionView方法里更新的是collectionViewArray数组,如果这两个不是同一个变量的引用,重载数据时会出现数据源不一致的问题,建议统一使用同一个数据源变量承载列表数据,避免逻辑冲突。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

