我正在开发SWIFT中的一个iOS应用程序,这是一个学习iOS/移动开发人员的个人项目.这是一个库存跟踪系统,用户输入自己的库存,然后显示出来.

AddInventoryView上工作,这是通过InventoryViewNavigationStack进入的.在AddInventoryView中,我希望用户能够添加详细信息,然后将新的库存保存到应用程序中-我只希望保存按钮/标签/文本在AddInventoryView中的所有字段都已填写时出现,并且当用户点击保存时,我希望库存保存到核心数据中,并将视图重置为InventoryView.我正在努力设置both保存并链接到另一个视图的按钮/标签/字符串.库存正被保存到核心数据.

AddInventoryView:

import SwiftUI
import CoreData

struct AddInventoryView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @State var name = ""
    @State var cost = ""
    @State var volume = ""
    
    var body: some View {

        ZStack {
            NavigationStack {
                Form {
                //section with TextField's storing input
                }
                .navigationTitle("Add Inventory")
            }
            // if/else to only display once TextField's have values
            if(name != "" && cost != "" && volume != "") {
                Button("Save") {
                    self.saveInventory(name: name, cost: cost, volume: volume)
                }
            }
        }
    }
    
    func saveInventory(name: String, cost: String, volume: String) {
    // Save input to core data func
    }
}

我曾try 使用NavigationLink而不是按钮,但之后我很难保存到核心数据.使用NavigationLink还使得在填写字段后很难显示only,除非我应该使用一种比if/Else更好的方法来显示按钮.我很难找到一种链接回InventoryView and保存到核心数据的方法.它不一定是一个按钮,但我希望它是一个按钮.

推荐答案

在父视图中使用NavigationStackdismisstry 此方法 子视图save中的按钮转换回.

示例代码:

struct ContentView: View {
    var body: some View {
        NavigationStack {  // <--- here
            NavigationLink(destination: AddInventoryView()) {
                Text("Add to Inventory")
            }
        }
    }
}

struct AddInventoryView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @Environment(\.dismiss) var dismiss  // <--- here
    
    @State var name = ""
    @State var cost = ""
    @State var volume = ""
    
    var body: some View {
        Form {
            TextField("name", text: $name)
            TextField("cost", text: $cost)
            TextField("volume", text: $volume)
        }
        .navigationTitle("Add Inventory")
        // if/else to only display once TextField's have values
        if(!name.isEmpty && !cost.isEmpty && !volume.isEmpty ) {
            Button("Save") {
                self.saveInventory(name: name, cost: cost, volume: volume)
                dismiss() // <--- here
            }
        }
    }
    
    func saveInventory(name: String, cost: String, volume: String) {
        // Save input to core data func
    }
}

编辑-1:

您也可以使用另一种使用NavigationPath的方法. 请参阅:https://developer.apple.com/documentation/swiftui/navigationstack/#Manage-navigation-state

例如:

struct ContentView: View {
    @State var path = NavigationPath()  // <--- here
    
    var body: some View {
        NavigationStack(path: $path){  // <--- here
            NavigationLink(value: "add") {
                Text("Add to Inventory")
            }
            .navigationDestination(for: String.self) { _ in
                AddInventoryView(path: $path)  // <--- here
            }
        }
    }
}

struct AddInventoryView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @Binding var path: NavigationPath  // <--- here
    
    @State var name = ""
    @State var cost = ""
    @State var volume = ""
    
    var body: some View {
        Form {
            TextField("name", text: $name)
            TextField("cost", text: $cost)
            TextField("volume", text: $volume)
        }
        .navigationTitle("Add Inventory")
        // if/else to only display once TextField's have values
        if(!name.isEmpty && !cost.isEmpty && !volume.isEmpty ) {
            Button("Save") {
                self.saveInventory(name: name, cost: cost, volume: volume)
                path = NavigationPath() // <--- here, go to wherever you want
            }
        }
    }
    
    func saveInventory(name: String, cost: String, volume: String) {
        // Save input to core data func
    }
}

使用Save按钮对我来说已经是老式的了.我会打包 namecostvolume组成一个实体并使用它. 请看这个链接,它为你提供了一些如何管理应用程序中的数据的很好的例子: Managing model data in your app.

Swift相关问答推荐

通过withstickedContinuation传递通用类型T

同步问题,发送Api Call之前未设置idToken

日期格式yyyyyy—MM—dd hh:mm:ss +0000到dd MMM,以swift格式表示""""

如何消除SwiftUI中SF符号的填充

如何在init()中使用setter/getters?

了解SWIFT中的命名VS位置函数调用

字典下标或运算符,如果密钥不存在,则添加指定的默认&值是SWIFT?

无法创建MKAssociateRegion对象

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

ClosedRange.Swift 中 Int 的索引?

如何在visionOS中将模型锚定在用户头部上方?

SwiftUI .task 视图修改器:运行在哪个线程中?

SwiftUI:当 currentIndex 值更改时,数组中的第 n 个视图是否已换出?

在 Swift 中为(递归)扩展提供默认实例参数

如何使用 Swinject 注册符合 ObservableObject 的协议?

无法分配给属性:absoluteString是一个只能获取的属性

Xcode:方法参数的代码完成

在 Swift 中获取双精度的小数部分

Swift 3.0 的 stringByReplacingOccurencesOfString()

转换为 swift 3 后,视图控制器中出现奇怪的通用函数