首页 > 解决方案 > 在 SwiftUI 中创建和编辑的视图相同

问题描述

几天以来,我试图找到一种解决方案,在 SwiftUI 中使用相同的视图创建和编辑 CoreData 对象。

假设我们有一个名为 的 CoreData 实体Entry。它只有一个属性name: String

现在我们有一个包含所有Entry对象列表的主/主视图。要导航到 DetailView,我使用以下代码:

List {
    ForEach(entires) { entry in
        NavigationLink(destination: DetailView(entry: entry)) {
            Text(item.name ?? "empty")
        }
    }
} 

在这个 DetailView 中,我可以编辑现有对象:

struct DetailView: View {
    @Environment(\.presentationMode) var presentationMode
    @Environment(\.managedObjectContext) private var viewContext
    
    @State var name: String = ""
    
    @ObservedObject var entry: Entry
    
    init(entry: Entry) {
        self.entry = entry
        self._name = State(initialValue: entry.name ?? "")
    }
    
    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Name", text: $name)
                    Button("Save") {
                        
                        guard name != "" else {return}
                        entry.name = name
                        
                        do {
                            try viewContext.save()
                            print("saved")
                        } catch {
                            print(error.localizedDescription)
                        }
                        
                        presentationMode.wrappedValue.dismiss()
                    }
                }
                Button("Cancel") {
                    presentationMode.wrappedValue.dismiss()
                }.accentColor(.red)
            }
            .navigationTitle("Entry Name")
        }
    }
}

但是我需要一个不同的视图,它对于新条目看起来完全一样,因为这个视图不需要@ObservedObject. 我通过主/主视图中的简单添加按钮访问此视图,它看起来像这样:

struct AddView: View {
    @Environment(\.presentationMode) var presentationMode
    @Environment(\.managedObjectContext) private var viewContext
    
    @State var name: String = ""
    
    var body: some View {
        NavigationView {
            Form {
                TextField("Name", text: $name)
                Button("Save") {
                    
                    guard name != "" else {return}
                    
                    let entry = Entry(context: viewContext)
                    entry.name = name
                    
                    do {
                        try viewContext.save()
                        print("saved")
                    } catch {
                        print(error.localizedDescription)
                    }
                    
                    presentationMode.wrappedValue.dismiss()
                }
                
                Button("Cancel") {
                    presentationMode.wrappedValue.dismiss()
                }.accentColor(.red)
            }
            .navigationTitle("Add new Entry")
        }
    }
}

我在这里不喜欢的是我有两个 99% 相等的视图,除了一个有@ObservedObject,另一个没有。如何将这两个视图合并为一个?我需要的是一个@ObservedObject var entry: Entry?我可以保持条目可选的地方。

标签: swiftswiftui

解决方案


推荐阅读