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

快速切换Sheet时显示错误数据问题求助

问题分析与解决方案

问题根源在于EntryDetail中@State变量的生命周期特性,结合SwiftUI快速切换Sheet时的视图复用机制:

  • @State修饰的变量会与View实例绑定,当系统为性能复用EntryDetail实例时,localEntry会保留之前的条目内容,不会随新传入的entry重新初始化
  • 每次初始化EntryDetail时创建独立ModelContext的逻辑,在快速切换场景下无法覆盖@State保留的旧数据

修正代码

修改EntryDetail实现,移除@State改用@Bindable管理编辑对象,确保每次传入新条目时正确从上下文获取对应实例:

struct EntryDetail: View {
    private let entry: Entry?
    private let localContext: ModelContext
    
    @Bindable private var localEntry: Entry
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        VStack {
            Form {
                TextField("Type your entry", text: $localEntry.content, axis: .vertical)
            }
        }
        .navigationTitle("Entry")
        .toolbar {
            ToolbarItem(placement: .confirmationAction) {
                Button("Save") {
                    try? localContext.save()
                    dismiss()
                }
            }
        }
    }
    
    init(entry: Entry?, in container: ModelContainer) {
        localContext = ModelContext(container)
        localContext.autosaveEnabled = false
        self.entry = entry
        
        if let entry {
            // 从当前localContext中获取对应条目实例
            guard let fetchedEntry = localContext.model(for: entry.id) as? Entry else {
                self.localEntry = Entry(content: "")
                localContext.insert(self.localEntry)
                return
            }
            self.localEntry = fetchedEntry
        } else {
            let newEntry = Entry(content: "")
            localContext.insert(newEntry)
            self.localEntry = newEntry
        }
    }
}

额外优化(可选)

给Sheet添加id修饰符,强制SwiftUI根据条目ID创建新实例,彻底规避视图复用问题:

// 在ContentView的sheet调用中添加.id修饰符
.sheet(item: $selectedEntry) { entry in
    NavigationStack {
        EntryDetail(entry: entry, in: context.container)
    }
    .id(selectedEntry?.id)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:04:56