如何在SwiftUI中展开到MainView

时间:2019-12-25 15:00:06

标签: swiftui swiftui-navigationlink

我找不到从ViewB转到ContentView的方法,而不在其他NavigationView上显示第二个NavigationView

struct ContentView: View {
    var body: some View {
        NavigationView{
            VStack {
                Text("Go to ViewA")
                NavigationLink(destination: ViewA()) {Text("Go")}
            }.navigationBarTitle("ContentView")
        }
    }
}

struct ViewA: View {
   @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("Go to ViewB")
            NavigationLink(destination: ViewB()) {Text("Go to B")}
            Text("Go back")
            Button(action: { self.presentationMode.wrappedValue.dismiss() }) {Text("Go to ContentView")}
        }.navigationBarTitle("ViewA")
    }
}

struct ViewB: View {
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("Go Home")
            NavigationLink(destination: ContentView()) {Text("Go")}
            Text("Go back")
            Button(action: { self.presentationMode.wrappedValue.dismiss() }) {Text("Go to ViewB")}
        }.navigationBarTitle("ViewB")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在“旧” Swift中,我可以轻松地进行

@IBAction func unwindToVCMain(segue:UIStoryboardSegue) { }
}

并像

一样轻松地调用它
performSegue(withIdentifier: "unwindToVcMain", sender: nil)

enter image description here

2 个答案:

答案 0 :(得分:2)

使用 Swiftui NavigationLink

首先,将您的第一个视图嵌入到导航控制器中。

然后插入一个导航链接到下一个视图。 NavigationLink 有不同的初始化程序。 使用 isActive 参数选择这个:

ScreenshotNavLink

一开始有点费解,但是当点击链接并且导航移动到下一个屏幕时,isActive 中的 NavigationLink 参数变为 true

> <块引用>

它创建一个实例,在活动时呈现目的地

如果我传递一个绑定来跟踪这个属性的状态,如果在我随后的视图链中的任何时候再次将它设置为 false,它将重置并返回到原始屏幕!挺整洁的!!

在代码中查看此简短示例:

struct ContentView: View {
    @State private var isActive: Bool = false

    var body: some View {
        NavigationView {
            NavigationLink(
                destination: SecondView(isActive: $isActive),
                isActive: $isActive,
                label: {
                    Text("Go to second View")
                })
                .navigationTitle("MainView")
        }
    }
}

我的第二个视图:

struct SecondView: View {
    @Binding var isActive: Bool

    var body: some View {
            NavigationLink("Go to Third View",destination:  ThirdView(isActive: $isActive))
                .navigationTitle("Second View")
    }
}

这里是放松按钮,但它可以在任何视图中。 设置 isActive = false 在这里有一些魔力!

struct ThirdView: View {
    @Binding var isActive: Bool

    var body: some View {
        Button("Unwind!"){
            isActive = false
        }
        .navigationTitle("Last View!")
    }
}

答案 1 :(得分:0)

我也在寻找那种方法。
我采用了两次调用self.presentationMode.wrappedValue.dismiss()的方法,但是它与取消事务的行为并不完全相同。