You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)")
        }
    }
}

NavigationLink的核心逻辑是点击即触发导航跳转,很难在跳转前稳定执行保存操作(即使加onTapGesture也容易和导航逻辑冲突)。而Button配合@Environment(\.dismiss)的方案更直接:先执行保存逻辑,再主动触发返回,完全匹配你的需求。

额外优化提示

如果需要更严格的字段校验(比如数量必须是有效数字),可以修改isFormValid的判断逻辑:

private var isFormValid: Bool {
    !name.isEmpty && Int(quantity) != nil && !location.isEmpty
}

内容的提问来源于stack exchange,提问作者Suede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:22:22