Swift开发:Core Data保存库存后如何返回InventoryView并控制按钮显示
解决AddInventoryView保存后返回并控制按钮显示的问题
1. 控制保存按钮的显示/启用状态
给每个输入字段绑定@State变量,通过计算属性判断所有字段是否填写完整,以此控制按钮的可用性或显示状态:
struct AddInventoryView: View { // 绑定输入字段 @State private var name: String = "" @State private var quantity: String = "" @State private var location: String = "" // Core Data上下文(假设已配置) @Environment(\.managedObjectContext) private var viewContext // 导航返回用的环境变量 @Environment(\.dismiss) private var dismiss // 判断表单是否填写完整 private var isFormValid: Bool { !name.isEmpty && !quantity.isEmpty && !location.isEmpty // 若需数字校验,可追加:Int(quantity) != nil } var body: some View { NavigationStack { Form { TextField("库存名称", text: $name) TextField("数量", text: $quantity) TextField("存放位置", text: $location) } .navigationTitle("添加库存") .toolbar { ToolbarItem(placement: .confirmationAction) { Button("保存") { saveInventory() dismiss() // 保存完成后返回上一页 } .disabled(!isFormValid) // 表单无效时按钮置灰 // 若要完全隐藏按钮:.opacity(isFormValid ? 1 : 0) } } } } // 你的Core Data保存逻辑(已实现部分) private func saveInventory() { let newInventory = Inventory(context: viewContext) newInventory.name = name newInventory.quantity = Int16(quantity) ?? 0 newInventory.location = location do { try viewContext.save() } catch { let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } }
2. 为什么不用NavigationLink
NavigationLink的核心逻辑是点击即触发导航跳转,很难在跳转前稳定执行保存操作(即使加onTapGesture也容易和导航逻辑冲突)。而Button配合@Environment(\.dismiss)的方案更直接:先执行保存逻辑,再主动触发返回,完全匹配你的需求。
额外优化提示
如果需要更严格的字段校验(比如数量必须是有效数字),可以修改isFormValid的判断逻辑:
private var isFormValid: Bool { !name.isEmpty && Int(quantity) != nil && !location.isEmpty }
内容的提问来源于stack exchange,提问作者Suede
相关产品推荐
相关产品推荐

