SwiftUI-NavigationLink返回上一视图

时间:2020-06-15 13:52:51

标签: swiftui swiftui-list swiftui-navigationlink

我正在通过构建具有“设置视图”的应用程序来测试SwiftUI,我们将其称为ViewB。该视图有一个列表,您可以在其中选择一种语言。 在第一个视图中,ViewA有2个按钮“打开”或“选择语言”。

我要做的是,从ViewA开始,打开ViewB,选择一种语言,然后自动返回ViewA。这是我所做的:

ViewA

var body: some View {
    NavigationView {
        VStack(alignment: .center) {
            Button(action: start) {
                Text("Open")
            }
            NavigationLink(destination: ViewB()) {
                Text("Change language")
            }
        }
        .sheet(isPresented: $presenting) {
            DemoView(code: self.langugage ?? "SE") { result in }
        }
    }
}

这就是我在ViewB上走的距离:

var body: some View {
    List(langs) { item in
        HStack {
            NavigationLink(destination: ViewA(presentingSuccessScreen: self.$isPresentingSuccessScreen, language: item.code)) {
                Image(item.icon).resizable().frame(width: 40, height: 40)
                Text(item.market)
            }.frame(height: 64)
        }
        .navigationBarTitle(Text("Select Language"), displayMode: .inline)
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(trailing:
            Button("Cancel") {
                self.presentationMode.wrappedValue.dismiss()
        })
    }
}

我想在每行的右侧显示“>”图像,您可以通过NavigationList自动获得该图像,并且希望整行都可以选择。但是通过这种方式,我得到的只是将目标视图推到堆栈的顶部,因此,如果我多次更改语言,最终会导致很多视图相互重叠。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

NavigationLink仅在一个方向上起作用。相反,您需要类似

的东西
HStack {
    VStack {
        Image(item.icon).resizable().frame(width: 40, height: 40)
        Text(item.market)
    }.frame(height: 64)
    .onTapGesture {
        // set item.code & success flag to some view model and then
        // just call dismiss to return to ViewA
        self.presentationMode.wrappedValue.dismiss()
    }
}