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

SwiftUI中ForEach因重复ID导致视图内容重复显示问题

解决SwiftUI ForEach中重复字符串导致的视图内容重复问题

问题核心在于你使用了id: \.self作为ForEach的标识,当数组中存在重复字符串时,SwiftUI无法区分不同的元素——因为它们的id完全相同,这会触发错误的视图复用逻辑,导致切换视图后显示重复内容。而你添加的@Attribute(.unique)是用来标记Core Data中整个属性值唯一(比如确保不同ActiveStash实例的userReports数组不重复),无法解决数组内部元素重复的问题。

推荐解决方案:使用带唯一标识符的自定义模型

将字符串数组替换为包含唯一ID的自定义Core Data模型,让ForEach能精准识别每个元素:

  1. 创建Report模型:
@Model
final class Report {
    @Attribute(.unique) var id: UUID = UUID()
    var content: String
    
    init(content: String) {
        self.content = content
    }
}
  1. 修改ActiveStash模型,将userReports改为关联关系:
@Model
final class ActiveStash {
    var substanceClass: String
    var substance: String
    var weight: UInt
    var substanceCost: UInt?
    var StashDescription: String?
    var date: Date
    var unit: String
    var dosages: Int?
    @Relationship var userReports: [Report] = []
}
  1. 更新ForEach代码,使用Report的id作为标识:
Section(header: Text("Reports")) {
    ForEach(stashed.userReports, id: \.id) { report in
        NavigationLink(destination: ReportView(report: report.content)) {
            VStack(alignment: .leading) {
                Text("Date")
                    .bold()
                Text(report.content)
            }
        }
    }
}

临时替代方案(不推荐):使用数组索引作为id

如果暂时不想修改模型结构,可以用数组索引作为标识,但这种方式存在缺陷(数组元素增删或顺序变化时,会导致视图错误复用或重建):

Section(header: Text("Reports")) {
    ForEach(Array(stashed.userReports.enumerated()), id: \.offset) { index, report in
        NavigationLink(destination: ReportView(report: report)) {
            VStack(alignment: .leading) {
                Text("Date")
                    .bold()
                Text(report)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Defaced.Face

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:37:10