#core-data #swiftui #xcode11
#основные данные #swiftui #xcode11
Вопрос:
Цель: извлечение Извлечение объекта основных данных в средство выбора SwiftUI
Проблема: не понял, как передавать данные в средство выбора
import SwiftUI
struct DetailView: View {
@ObservedObject var order: Order
@State var showOrderEdit = false
var body: some View {
Form{
Text(order.flavor)
Text(order.tableNumber)
}
.navigationTitle(order.pizzaType)
.toolbar {
ToolbarItem(placement: .primaryAction) {
//edit button
Button(action: {
showOrderEdit = true
}, label: {
Text("Edit")
})
.sheet(isPresented: $showOrderEdit) {
DetailEdit(order: order)
}
}
}
}
}
import SwiftUI
struct DetailEdit: View {
@State var tableNumber = ""
@ObservedObject var order: Order
@Environment(.managedObjectContext) private var viewContext
@Environment (.presentationMode) var presentationMode
@State var selectedFlavor = Flavor.chocolate
enum Flavor: String, CaseIterable, Identifiable {
case chocolate
case vanilla
case strawberry
var id: String { self.rawValue }
}
var body: some View {
NavigationView {
Form {
//1- this work fine
TextField("table number", text: $tableNumber)
//2- this doesnt get updated
Picker("Flavor", selection: $selectedFlavor) {
Text("Chocolate").tag(Flavor.chocolate)
Text("Vanilla").tag(Flavor.vanilla)
Text("Strawberry").tag(Flavor.strawberry)
}
Text("Selected flavor: (selectedFlavor.rawValue)")
}
//fetch data from core data -> item edit
.onAppear {
//1- this work fine
self.tableNumber = self.order.tableNumber
//2- this doesnt get updated
self.selectedFlavor.rawValue = self.order.flavor
}
.navigationTitle("Edit Order")
}
}
Ответ №1:
Попробуйте это:
.onChange(of: selectedFlavor) {
self.order.flavor = $0.rawValue
}
.onAppear {
self.tableNumber = self.order.tableNumber
self.selectedFlavor = Flavor(rawValue: self.order.flavor)
}
Комментарии:
1. Detail-> Edit работает (необходимо принудительно развернуть), средство выбора обновляется! : ) Но… при выборе другого параметра в средстве выбора он сохраняет то же значение
2. пример: DetailView (выбран ванильный) -> EditView (выбран ванильный) -> Средство выбора (выбран шоколад) -> EditView (показывает ваниль, хотя мы изменили на шоколад)
3. вероятно, потому, что SwiftUI .onAppear снова извлекает основные данные в Picker> EditView?
4. При изменении значения средства выбора вам необходимо установить его обратно в объект core data (конечно, при условии, что вы сохраните весь объект позже). См. обновлено.
5. Спасибо! протестировано сейчас, но средство выбора по-прежнему не обновляется. сработало ли это на вашей стороне?