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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:14:53