带有 navigationLink 的 SwiftUI 消失后退按钮

Posted

技术标签:

【中文标题】带有 navigationLink 的 SwiftUI 消失后退按钮【英文标题】:SwiftUI disappear back button with navigationLink 【发布时间】:2021-04-27 19:24:35 【问题描述】:

我有 3 个视图。其中一个有 NavigationView,第二个有 NavigationLink,最后一个只是带有工具栏的子项。

所以当我在最后一个视图中添加工具栏时我的问题 backButton 优雅消失了。我该如何解决这个问题?

Screen recording of my problem

import SwiftUI

struct ContentView: View 
    var body: some View 
        NavigationView 
            VStack 
                Text("Hello, world!")
                    .padding()
                NavigationLink(destination: ListView()) 
                    
                    Image(systemName: "trash")
                        .font(.largeTitle)
                        .foregroundColor(.red)
                
            .navigationBarHidden(true)
            .navigationTitle("Image")
        
    


import SwiftUI

struct ListView: View 
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View 
        VStack 
            List 
                NavigationLink(destination: DetailView()) 
                    Text("Detail")
                
            
            
        .navigationBarTitle(Text("Data"), displayMode: .large)
        .toolbar 
            Button("Save") 
                presentationMode.wrappedValue.dismiss()
            
        
    


import SwiftUI

struct DetailView: View 
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View 
        
        VStack 
            Text("DetailView")
                .padding()
        .navigationBarTitle(Text("Data"), displayMode: .large)
        .toolbar 
            Button("Save") 
                presentationMode.wrappedValue.dismiss()
            
        
    

【问题讨论】:

【参考方案1】:

在控制台中,您会注意到以下消息:

2021-04-27 12:37:36.862733-0700 MyApp[12739:255441] [Assert] displayModeButtonItem 是内部管理的,不会针对 DoubleColumn 样式公开。返回一个空的、断开连接的 UIBarButtonItem 以履行非空合同。

NavigationView 的默认样式通常为DefaultNavigationViewStyle、which is really just DoubleColumnNavigationViewStyle。请改用StackNavigationViewStyle,它按预期工作。

编辑:你说得对,StackNavigationViewStyle 会破坏 iPad 拆分视图。但幸运的是,DoubleColumnNavigationViewStyle 在 iPad 上运行良好,并且不会隐藏后退按钮。然后我们可以根据设备使用不同的NavigationStyle,如this answer所示。

struct ResponsiveNavigationStyle: ViewModifier 
    @Environment(\.horizontalSizeClass) var horizontalSizeClass

    @ViewBuilder
    func body(content: Content) -> some View 
        if horizontalSizeClass == .compact  /// iPhone
            content.navigationViewStyle(StackNavigationViewStyle())
         else  /// iPad or larger iPhone in landscape
            content.navigationViewStyle(DoubleColumnNavigationViewStyle())
        
    


struct ContentView: View 
    var body: some View 
        NavigationView 
            VStack 
                Text("Hello, world!")
                    .padding()
                NavigationLink(destination: ListView()) 
                    
                    Image(systemName: "trash")
                        .font(.largeTitle)
                        .foregroundColor(.red)
                
            
            .navigationBarHidden(true)
            .navigationTitle("Image")
        
        .modifier(ResponsiveNavigationStyle()) /// here!
    

结果:

iPad iPhone

【讨论】:

.navigationViewStyle(StackNavigationViewStyle()) 但 iPAD 拆分视图损坏,所以我认为是不好的解决方案 我喜欢这个答案,@aheze - 谢谢。 (但我已经让自己定期检查是否仍然需要它!)

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

带有 navigationLink 的 SwiftUI 消失后退按钮

带有 `isActive=true` 的嵌套 NavigationLinks 未正确显示

带有 ObservableObject 的 SwiftUI - 包含 NavigationLink 的列表以在滚动时下载它的详细信息不出现

需要帮助使 NavigationLink 在 SwiftUI 中工作

在 NavigationLink 的嵌套 NavigationView 中列出核心数据对象的正确方法

NavigationLink 内的 tvOS 按钮不起作用