#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. гениально, приятель! есть ли у вас покровитель, чтобы я мог послать вам небольшое пожертвование?