SwiftUI Основные данные — обновление объекта (Подробно -> Детализация)

#core-data #swiftui #xcode11

#основные данные #swiftui #xcode11

Вопрос:

Цель: обновить объект основных данных с помощью SwiftUI: DetailView -> editDetail -> DetailView (обновленный).

Проблема: приведенный ниже код работает, но создает новый объект вместо обновления существующего.

 import SwiftUI

struct DetailView: View {
    
    var order = Order()
    
    @State var showOrderEdit = false


    var body: some View {
        
        Form{
        
        Text(order.tableNumber)
        Text(order.pizzaType)
            
        }
        .navigationTitle(order.pizzaType)
        
        .toolbar {

            ToolbarItem(placement: .primaryAction) {
                
                
                //edit button
                Button(action: {
                    showOrderEdit = true
                }, label: {
                    Text("Edit")
                })
                .sheet(isPresented: $showOrderEdit) {
                    OrderEdit(order: order)
                }
            }
        }

    }
}
 
 
import SwiftUI

struct DetailEdit: View {
    
    @State var tableNumber = ""
    
    @Environment(.managedObjectContext) private var viewContext
    @Environment (.presentationMode) var presentationMode

    var order = Order()

    var body: some View {
        
        NavigationView {

        
        Form {
        
            TextField("table number", text: $tableNumber)
            
            
            //update button
            Button(action: {
                updateOrder(order: order)
            }) {
                Text("Update")
                    .foregroundColor(.blue)
            }
        
        }
        
        //passing data item detail -> item edit
        .onAppear {
            self.tableNumber = self.order.tableNumber
        }
        
        .navigationTitle("Edit Order")

    }
}
    
    func updateOrder(order: Order) {
        let newtableNumber = tableNumber
        viewContext.performAndWait {
            order.tableNumber = newtableNumber
            try? viewContext.save()
        }
    }
    
  
 

Ответ №1:

Вы создаете новый Order объект в каждом представлении, поэтому он сохраняется как новый в базе данных. Вместо этого вам нужно ввести объект CoreData из родительского представления (который показывает DetailView) в качестве наблюдаемого объекта,

 struct DetailView: View {
    
    @ObservedObject var order: Order   // << here !!
    
// .. other code
 

и

 struct DetailEdit: View {
    
    @State var tableNumber = ""
    
    @Environment(.managedObjectContext) private var viewContext
    @Environment (.presentationMode) var presentationMode

    @ObservedObject var order: Order          // << here !!

// ... other code
 

при таком подходе вы будете работать с одним и тем же экземпляром Order в обоих представлениях, и они будут обновлены, потому что обратите внимание на этот экземпляр на предмет изменений.

Комментарии:

1. гениально, приятель! есть ли у вас покровитель, чтобы я мог послать вам небольшое пожертвование?