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

SwiftUI List滚动时结果显示不一致、ForEach计数不匹配报错如何解决?

报错原因

你现在使用的ForEach(0..<model.wins)这类写法,属于无显式ID的范围遍历,SwiftUI默认认为这种遍历的范围是固定常量,不会发生变化。但你列表中每个条目对应的wins、loses、draws数值都是动态变化的,列表滚动触发cell复用的时候,SwiftUI无法正确识别视图的差异,就会出现显示错乱,同时抛出计数不匹配的报错。

修复方案

只需要给DisplayMatchResultsIcons中的三个ForEach都添加显式的id参数,用遍历元素本身(即Int类型的索引)作为唯一标识即可,修改后的代码如下:

import SwiftUI
struct DisplayMatchResultsIcons {
    let model: ResultsModel
}

extension DisplayMatchResultsIcons: View {
    var body: some View {
        HStack (spacing: -1.0){
            // 添加id: \.self参数
            ForEach(0..<model.wins, id: \.self) {_ in
                Image(systemName: "w.square.fill")
                    .imageScale(.medium)
                    .foregroundColor(.green)
            }
            // 添加id: \.self参数
            ForEach(0..<model.loses, id: \.self) {_ in
                Image(systemName: "l.square.fill")
                    .imageScale(.medium)
                    .foregroundColor(.red)
            }
            // 添加id: \.self参数
            ForEach(0..<model.draws, id: \.self) {_ in
                Image(systemName: "d.square.fill")
                    .imageScale(.medium)
                    .foregroundColor(.yellow)
            }
        }
    }
}

原理说明

添加id: \.self后,SwiftUI会以遍历的每一个Int索引作为对应图标的唯一标识,当列表复用cell、对应数值变化时,系统可以正确计算视图差异,按需刷新图标内容,不会再出现显示错乱的问题。

内容的提问来源于stack exchange,提问作者BobC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:30:06