【问题标题】:Create a NavigationLink without back button SwiftUI创建没有后退按钮 SwiftUI 的 NavigationLink
【发布时间】:2020-02-22 00:22:09
【问题描述】:

我试图链接 SomeView1() 中的按钮操作以导航到 someView2() 而不在屏幕顶部有后退按钮。相反,我想在 SomeView2() 中添加另一个按钮,该按钮将导航回 SomeView1()。这在 SwiftUI 中是否可行?

SomeView1()

struct SomeView1: View {
    var body: some View {
        NavigationView {
            VStack {
                //...view's content

                NavigationLink(destination: SomeView2()) {
                    Text("go to SomeView2")
                }
                Spacer()
            }
        }
    }
}

SomeView2()

struct SomeView2: View {
    var body: some View {
        NavigationView {
            VStack {
                //...view's content

                NavigationLink(destination: SomeView1()) {
                    Text("go to SomeView1")
                }
                Spacer()
            }
        }
    }
}

这就是它的样子:

【问题讨论】:

    标签: swift navigation swiftui


    【解决方案1】:

    在这里得到你想要的东西的正确方法是使用presentationMode 环境变量:

    import SwiftUI
    
    struct View2: View {
        @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
        var body: some View {
            VStack {
                Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("POP")
                }
            }
            .navigationBarTitle("")
            .navigationBarBackButtonHidden(true)
            .navigationBarHidden(true)
        }
    }
    
    struct ContentView: View {
        var body: some View {
            NavigationView {
                NavigationLink(destination: View2()) {
                    Text("PUSH")
                        .navigationBarTitle("")
                        .navigationBarHidden(true)
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    【讨论】:

    • 谢谢,这正是我想要的!我希望文档有更多关于这些事情的信息
    • 最佳解决方案 =)
    【解决方案2】:

    你可以在SomeView2()做这样的事情:

    NavigationView {
       VStack {
                //...view's content
    
            NavigationLink(destination: SomeView1()) {
                Text("go to SomeView1")
            }
            Spacer()
        }
    }.navigationBarBackButtonHidden(true)
    

    【讨论】:

    • 这确实隐藏了后退按钮,但是当您导航时它仍然将视图向下推到屏幕上(好像它仍然为后退按钮腾出空间)。在 2 个视图之间来回导航后,视图会在屏幕的中间位置结束
    • 你也可以试试.navigationBarHidden(true)
    • 我仍然遇到同样的问题。我添加了一张图片供参考
    • 除了 NavigationLink 之外还有其他方法吗?
    • 这个答案似乎是最明智的,特别是如果 NavigationView 中有多个导航链接需要相同的行为。但是,我发现需要的是 .navigationBarHidden(true)
    【解决方案3】:

    我认为您应该在整个导航过程中只使用一个 NavigationView。现在,您在彼此内部拥有了三个 NavigationView,这会产生三个后退按钮。

    所以在你的情况下,它会变成这样:

    struct SomeView1InsideNavigationView: View { // This should be the first view you present
        var body: some View {
            NavigationView { // Use NavigationView only once
                SomeView1()
            }
        }
    }
    
    struct SomeView1: View {
        var body: some View {
            VStack { // Do *not* use NavigationView here
                //...view's content
    
                NavigationLink(destination: SomeView2()) {
                    Text("go to SomeView2")
                }
                Spacer()
            }
        }
    }
    
    struct SomeView2: View {
        var body: some View {
            VStack { // Do *not* use NavigationView here
                //...view's content
    
                NavigationLink(destination: SomeView1()) {
                    Text("go to SomeView1")
                }
                Spacer()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多