0

就我而言,我有一个ContactProfile要更新的视图。我认为制作联系人实体的副本,编辑副本,然后将副本的属性“粘贴”回原始实体,然后将其保存在managedObjectcontext.

到目前为止,我的代码仅tempContact引用了原始联系人。这是有道理的,因为原始联系人是 CoreData 生成的类,而不是结构。

解决这个问题的最佳方法是什么?还是我想太多了?本身是否@ObservedObject足以进行编辑,因为直到通过private func saveContext()稍后在代码中显式调用函数才将其保存到数据库中?

到目前为止,我有这个代码:

    struct ContactProfile: View {
        
        @Environment(\.managedObjectContext) private var viewContext
        
        @FetchRequest(
            sortDescriptors: [NSSortDescriptor(keyPath: \Level.sortOrder, ascending: true)],
            animation: .default)
        
        private var levels: FetchedResults<Level>
        
        @ObservedObject var contact: Contact
        
/// Old code
///        @State private var tempContact: Contact

///        init(contact: Contact){
///            _contact = ObservedObject(initialValue: contact)
///            _tempContact = State(wrappedValue: contact)
///        }
   

///updated code below:
    
    @State private var tempContact = TempContact(firstName: "", lastName: "", birthDate: Date(), picture: nil)
        
    init(contact: ObservedObject<Contact>) {
        _contact = contact
        _tempContact = State(initialValue: tempContact)
        tempContact.firstName = contact.wrappedValue.firstName ?? ""
        tempContact.lastName = contact.wrappedValue.lastName ?? ""
    }

     ///end of updated code


        var body: some View {
            Form {
                Text("@Observed: \(contact.firstName ?? "Unknown") \(contact.lastName ?? "Unknown")")
                Text("@State: \(tempContact.firstName ?? "Unknown") \(tempContact.lastName ?? "Unknown")")
                
                TextField("Enter name", text: Binding(
                    get: { self.tempContact.firstName ?? ""},
                    set: { self.tempContact.firstName = $0 }
                )
                )
                
                [snipped the rest of the normal view code]
                

可以这样ContactProfile访问ContactsList


struct ContactsList: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Contact.lastName, ascending: true)],
        animation: .default
    )
    
    private var contacts: FetchedResults<Contact>
    
    var body: some View {
        List {
            ForEach(contacts) { contact in
                NavigationLink(
                    destination: ContactProfile(contact: contact)) {
                    HStack (alignment: .firstTextBaseline) {
                        Text("\(contact.firstName ?? "Unknown") \(contact.lastName ?? "Unknown")")
                        Text("(\(contact.level?.name ?? ""))").font(.caption).foregroundColor(.gray)
                    }
                }
            }
            .onDelete(perform: deleteContacts)
        }
        .listStyle(PlainListStyle())
        .navigationTitle("Contacts")
        .navigationBarItems(trailing: Button(action: addContact) { Image(systemName: "plus") }
        )
    }
    
    [snip]
   
4

1 回答 1

0

在 Core Data 中处理更新很简单:

  1. 将您的 CoreData 托管对象传递到视图中。
  2. 设置变量以处理数据编辑输入并将它们设置为 CoreData 对象值的值,类似于您的结构,但在视图中为 @State。
  3. 验证输入后,将每个属性设置为其对应的 @State 变量,如下所示:[Your Entity Name].setValue([Your @State Variable], forKey: "[Your Attribute Name]")。
  4. 将您的实体保存在托管对象上下文中,就像您创建该特定对象时一样。

这将更新您的对象,而不是创建一个新对象。

于 2020-12-21T18:47:57.093 回答