Извлечение объекта основных данных в средство выбора SwiftUI

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