从子视图返回后刷新选择器

问题描述 投票:0回答:1

我有一个添加新库存对象的视图。为此,您需要从分配给它的选取器中选择一个 Vessel 对象。如果尚未创建容器,它会提示您首先打开一个工作表来添加容器,然后在添加容器后关闭该工作表。

如果我运行此命令并且容器已经存在,则一切都会按预期运行。但是,如果还没有任何 Vessels 可供选择,它会在工作表上调出 VesselNewView(),并正确地将新对象添加到 Vessel 类中。当它返回到 NewInventorySheet 时,它现在显示选择器并选中添加的 Vessel。但事实并非如此。如果我此时

print("vessel= \(vessel)")
,我会得到
vessel = <Vessel: 0x6000017d07c0> (entity: <null>; id: (null); data: <fault>)
,并且尝试保存会导致应用程序崩溃。

但是,如果我单击选择器并重新选择看起来已经选择的项目,那么它就可以正常工作。 在 NewVesselView 上添加容器返回后,如何强制 NewInventoryView 刷新容器的选取器选择?

这是我的代码:

import SwiftUI

struct InventoryNewView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    @State private var showSheetVessel = false
    
    @FetchRequest(
        sortDescriptors: [SortDescriptor(\.name)])
    var vessels:FetchedResults<Vessel>
    
    @Environment(\.dismiss) var dismiss
    @State var name = ""
    @State var vessel = Vessel()
    
    var body: some View {
        NavigationView {
            ScrollView {
                VStack(alignment: .leading){
                    Grid(alignment: .leading) {
                        GridRow {
                            Text("Name:")
                            TextField("Inventory item", text: $name)
                        }
                        .padding(.bottom, 5)
                        GridRow {
                            Text("Assigned to:")
                            if vessels.isEmpty == false {
                                Picker("", selection: $vessel) {
                                    ForEach(vessels) { (vessel: Vessel) in
                                        Text(vessel.name)
                                            .tag(vessel)
                                    }
                                }
                            }
                            else {
                                Text("Add Vessel")
                                    .fontWeight(.semibold)
                                    .foregroundColor(Color.red)
                            }
                            Button(action: {
                                self.showSheetVessel.toggle()
                            }) {
                                Image(systemName: "plus.circle")
                                    .font(.footnote)
                            }.sheet(isPresented: $showSheetVessel) {
                                VesselNewView()
                            }
                        }
                        .padding(.bottom, 5)
                    }
                }
                .navigationTitle("Add New Inventory")
                .navigationBarItems(
                    trailing:
                        Button("Add") {
                            addInventory()
                            dismiss()
                        }
                        .disabled(name.isEmpty)
                )
            }
        }
        
        func addInventory() {
            // Add the item into Core Data
            let inventory = Inventory(context: viewContext)
            inventory.id = UUID()
            inventory.name = name
            inventory.vessel = vessel
            vessel.addToInventory(inventory)
            
            
            do {
                try viewContext.save()
            }
            catch {
            }
            
        }
    }
}
ios xcode swiftui core-data picker
1个回答
0
投票

要更新所选的

vessel
,请添加

 .onChange(of: vessels.last) { if let vesl = vessels.last { vessel = vesl } } 
 

NavigationView{...}

请注意,

NavigationView
已弃用,您应该使用
NavigationStack

© www.soinside.com 2019 - 2024. All rights reserved.