SwiftUI中ForEach因重复ID导致视图内容重复显示问题
解决SwiftUI ForEach中重复字符串导致的视图内容重复问题
问题核心在于你使用了id: \.self作为ForEach的标识,当数组中存在重复字符串时,SwiftUI无法区分不同的元素——因为它们的id完全相同,这会触发错误的视图复用逻辑,导致切换视图后显示重复内容。而你添加的@Attribute(.unique)是用来标记Core Data中整个属性值唯一(比如确保不同ActiveStash实例的userReports数组不重复),无法解决数组内部元素重复的问题。
推荐解决方案:使用带唯一标识符的自定义模型
将字符串数组替换为包含唯一ID的自定义Core Data模型,让ForEach能精准识别每个元素:
- 创建Report模型:
@Model final class Report { @Attribute(.unique) var id: UUID = UUID() var content: String init(content: String) { self.content = content } }
- 修改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] = [] }
- 更新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
相关产品推荐
相关产品推荐

