创建没有后退按钮 SwiftUI 的 NavigationLink

Posted

技术标签:

【中文标题】创建没有后退按钮 SwiftUI 的 NavigationLink【英文标题】:Create a NavigationLink without back button SwiftUI 【发布时间】: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()
            
        
    

这就是它的样子:

【问题讨论】:

【参考方案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()
        
    

【讨论】:

以上是关于创建没有后退按钮 SwiftUI 的 NavigationLink的主要内容,如果未能解决你的问题,请参考以下文章

在没有以前 NavigationLink 的 SwiftUI NavigationView 上显示系统后退按钮

SwiftUI 将 navigationBarItems 按钮与“消息”中的大 navigationBarTitle 对齐

如何在 SwiftUI 视图中包装 UIBarButtonItem?

SwiftUI Navigation 多个后退按钮

SwiftUI 在 NavigationLink 中更改后退按钮的颜色

带有 navigationLink 的 SwiftUI 消失后退按钮