You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UICollectionViewCell复用状态异常 prepareForReuse用法咨询

问题结论

你的prepareForReuse方法的调用写法本身是符合规则的(调用super方法后执行重置逻辑的时机没有问题),但单元格复用后样式错乱的核心原因是你的setDefault()重置逻辑不全,没有覆盖所有被setBlueColor()修改过的属性,和prepareForReuse的调用方式无关。

具体问题点

你可以对比两个样式方法修改的属性:

  • setBlueColor()一共修改了5个样式属性:
    • viewCard.backgroundColor 设为蓝色
    • viewCard.layer.borderWidth 设为0
    • viewCard.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:51:22