快速切换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
相关产品推荐
相关产品推荐

