【问题标题】:SwiftUI - IOS 16 - Using Biding with NavigationStackSwiftUI - IOS 16 - 使用 NavigationStack 进行竞价
【发布时间】:2022-12-15 22:50:05
【问题描述】:

我有以下视图结构,例如:根视图 -> 详细视图 -> 编辑视图 -> 详细编辑视图

因此,用户可以将 NavigationLink 与 (value: ...) 结合使用以转到下一个视图。

如何将绑定从编辑视图传递到详细编辑视图?使用旧的 NavigationView & -Link 没有问题,但现在 Rot View 使用 .navigationDestination 在这里调用每个视图,当然我无法从编辑视图访问 @States。

我目前的解决方法: 我正在创建一个带有单例的 ObservableObject,并在 init() 调用上从编辑视图传递 @State。从那里开始,我正在使用 ObservableObject 属性(在编辑视图和详细编辑视图中)

【问题讨论】:

    标签: swift swiftui ios16


    【解决方案1】:

    要将 Binding 从 EditView 传递到新 NavigationView 中的 DetailEditView,您可以使用 NavigationLink 的 isDetailLink 参数。当设置为 true 时,NavigationLink 会将其目标视图的绑定作为参数传递给 navigationDestination 视图。

    这是一个例子:

    struct EditView: View {
        @State var text: String
        var body: some View {
            NavigationLink(
                destination: DetailEditView(text: $text),
                isDetailLink: true
            ) {
                Text("Edit")
            }
        }
    }
    
    struct DetailEditView: View {
        @Binding var text: String
        var body: some View {
            TextField("Text", text: $text)
        }
    }
    

    在上面的示例中,EditView 通过 NavigationLink 的 isDetailLink 参数将其 @State 变量文本作为绑定传递给 DetailEditView。然后 DetailEditView 可以使用 @Binding 变量文本,就好像它是一个常规的 @State 变量一样。

    也可以使用您在问题中提到的 ObservableObject 方法。为此,您需要创建一个 ObservableObject 类来保存您希望在视图之间共享的状态,并将此类的实例作为 @ObservedObject 属性传递给 EditView 和 DetailEditView。然后,视图可以使用 @ObservedObject 属性来访问共享状态。

    这是您如何执行此操作的示例:

    class SharedState: ObservableObject {
        @Published var text: String
    }
    
    struct EditView: View {
        @ObservedObject var state: SharedState
        var body: some View {
            NavigationLink(
                destination: DetailEditView(state: state),
                isDetailLink: true
            ) {
                Text("Edit")
            }
        }
    }
    
    struct DetailEditView: View {
        @ObservedObject var state: SharedState
        var body: some View {
            TextField("Text", text: $state.text)
        }
    }
    

    在上面的示例中,SharedState 类包含在 EditView 和 DetailEditView 之间共享的文本属性。视图使用 @ObservedObject 属性 state 来访问共享状态,并且可以使用常规 Swift 代码修改共享文本属性。

    这两种方法各有优缺点,因此您应该选择最适合您的需求和用例的一种。

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 2022-11-03
      • 2022-09-29
      • 1970-01-01
      • 2022-08-23
      • 2022-10-06
      • 2022-11-10
      • 2022-12-27
      • 2023-01-24
      相关资源
      最近更新 更多