SwiftUI中Realm数据库列表跳转详情页仅显示首条数据问题
问题原因及解决方案
问题原因
你在ForEach循环中给每个列表项都绑定了同一个布尔状态变量editPattern来控制sheet显示。当点击任意列表项时,editPattern变为true,此时SwiftUI会批量触发所有循环内定义的sheet初始化逻辑,但由于状态变量共享,最终实际展示的sheet会错误地捕获到同一份userPattern(也就是列表的第一条数据),导致详情页内容不匹配。
修复方案
改用sheet(item:)替代sheet(isPresented:),通过绑定可选的选中项来控制sheet的显示,确保每个点击操作都关联到对应的具体数据:
修改后的列表代码
// 新增可选变量,存储当前选中的Patterns实例 @State private var selectedPattern: Patterns? ForEach(realmManger.patterns, id: \.id) { userPattern in patternCell(title: userPattern.title ?? "Error??", date: userPattern.dateCreated ?? Date.now) .onTapGesture { // 点击时赋值选中的项 selectedPattern = userPattern } } // 使用sheet(item:)绑定选中项,自动处理显示/隐藏逻辑 .sheet(item: $selectedPattern) { selectedItem in patternEdit(userPattern: selectedItem) .environmentObject(realmManger) }
注意事项
确保你的Patterns模型已经遵循Identifiable协议(你在ForEach中使用了id: \.id,说明模型已经满足这个要求,无需额外修改)。
原理说明
sheet(item:)会根据绑定的可选值是否非nil来决定是否展示sheet,每次选中不同的item时,都会创建与该数据关联的独立详情页,从根源上避免了共享布尔状态导致的变量捕获混淆问题。
内容的提问来源于stack exchange,提问作者Eng.Maher
相关产品推荐
相关产品推荐

