SwiftUI中的动态NavigationLink目标?

时间:2019-10-27 10:07:51

标签: swift swiftui

我有一个视图'B',该视图的初始化程序带有一个参数。

struct B: View {
    let arg: Int

    init(arg: Int) {
        self.arg = arg
    }

    var body: some View {
        Text("\(arg)")
    }
}

我有一个导航视图'A'。

'A'有一个按钮,当按下该按钮时,会显示一个弹出窗口,用户可以在其中选择1-5的数字。类型为(Int) -> Void的闭包将使用选定的数字进行调用。

struct A: View {
    @State var showPicker = false

    var body: some View {
        NavigationView {
            Button(action: { self.showPicker = true }) {
                Text("Pick Number")
            }
            .sheet(isPresented: self.$showPicker, content: { 
                NumberPicker { number in 
                    *** Possible to navigate to B from here? ***
                } 
            })
        }
    }
}

问题
是否可以使用关闭的结果初始化视图B,然后导航到视图B?

过去DynamicNavigationDestinationLink可以做到这一点,但是Apple不推荐使用它,并在发行说明中指出NavigationLink现在包含其功能。我搜索了所有文档,但是,我仍然无法弄清楚如何使用NavigationLink产生相同的结果。

1 个答案:

答案 0 :(得分:0)

您需要添加一个新的视图以及另一个导航视图,您可以在其中选择号码。

这是我将如何处理的完整代码示例:

import SwiftUI

struct viewA: View {

    var body: some View {
        NavigationView {
            NavigationLink(destination: viewC()) {
                Text("Pick Number")
            }
        }
    }
}

struct viewB: View {

    @Binding var showSheet: Bool
    @Binding var arg: Int

    var body: some View {
        NavigationView {
            List {
                ForEach((1...5), id: \.self) {number in
                    Button(action: {
                        self.arg = number
                        self.showSheet.toggle()
                    }) {
                        Text("\(number)")
                    }
                }
            }
        }
    }
}

struct viewC: View {

    @State var showSheet:Bool = true
    @State var arg: Int = 0

    var body: some View {
        NavigationView {
            Text("\(arg)")
        }
        .sheet(isPresented: $showSheet) {
            viewB(showSheet: self.$showSheet, arg: self.$arg)
        }
    }
}