8

我找不到从 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()
    }
}

在“旧”斯威夫特我可以很容易地做一个 unwindSegue 像

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

并轻松地将其称为

performSegue(withIdentifier: "unwindToVcMain", sender: nil)

在此处输入图像描述

4

2 回答 2

2

使用 Swiftui NavigationLink

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

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

截图NavLink

一开始有点令人费解,但是当点击链接并且导航移动到下一个屏幕时,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!")
    }
}
于 2021-02-14T13:32:53.057 回答
0

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

于 2020-06-06T07:35:35.053 回答