我有一个添加新库存对象的视图。为此,您需要从分配给它的选取器中选择一个 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 {
}
}
}
}
要更新所选的
vessel
,请添加
.onChange(of: vessels.last) { if let vesl = vessels.last { vessel = vesl } }
到
NavigationView{...}
。
请注意,
NavigationView
已弃用,您应该使用NavigationStack
。