SwiftUI中保存编辑内容失效求助:点击Save后Note未更新
解决SwiftUI编辑笔记保存后原数据未更新的问题
问题原因
你用@State修饰note变量时,SwiftUI会对值类型创建独立的局部副本。点击「Save」时修改的只是这个副本,而非传入的原始Note实例,因此外部原数据不会同步变化。
解决方案
根据Note的类型(值类型struct/引用类型class),对应两种处理方式:
方式一:Note是值类型(struct)
将@State var note: Note改为@Binding var note: Note,通过绑定直接关联外部状态变量,修改时会同步更新原数据。同时保留临时编辑变量,确保取消编辑时不影响原数据。
修改后的完整代码:
struct EditNoteView: View { @Binding var note: Note @Environment(\.dismiss) var dismiss @State private var editedTitle: String @State private var editedContent: String init(note: Binding<Note>) { self._note = note self._editedTitle = State(initialValue: note.wrappedValue.title) self._editedContent = State(initialValue: note.wrappedValue.content) } var body: some View { NavigationStack { VStack { TextEditor(text: $editedTitle) .font(.title) .fontWeight(.bold) .frame(width: UIScreen.main.bounds.width, height: 50, alignment: .center) Divider() TextEditor(text: $editedContent) .font(.body) .frame(maxHeight:.infinity) } } .navigationBarBackButtonHidden(true) .toolbar { ToolbarItem(placement: .topBarLeading) { Button("Cancel") { dismiss() } } ToolbarItem(placement: .topBarTrailing) { Button("Save") { note.title = editedTitle note.content = editedContent dismiss() } } } } }
方式二:Note是引用类型(class)
先让Note遵循ObservableObject,给需要监听的属性加上@Published包装器,确保属性变化时通知视图更新:
class Note: ObservableObject { @Published var title: String @Published var content: String init(title: String, content: String) { self.title = title self.content = content } }
然后在视图中用@ObservedObject修饰note(实例由外部传入),保留临时编辑变量:
struct EditNoteView: View { @ObservedObject var note: Note @Environment(\.dismiss) var dismiss @State private var editedTitle: String @State private var editedContent: String init(note: Note) { self.note = note self._editedTitle = State(initialValue: note.title) self._editedContent = State(initialValue: note.content) } var body: some View { // 其余代码与方式一中的body部分完全一致 } }
说明
两种方式都保留了你原本的逻辑:仅点击「Save」时同步修改到原数据,点击「Cancel」则直接丢弃临时编辑内容,完全符合需求。
内容的提问来源于stack exchange,提问作者Douglas Nascimento
相关产品推荐
相关产品推荐

