工具栏正在删除 NavigationView 中的后退按钮

gur*_*gui 8 swift swiftui

我有一个列表的详细信息视图,我可以从主视图导航到该列表:

NavigationView {
    ...
    NavigationLink(destination: DetailView()) {
        Text(entity.name ?? "Unknown")
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后在我的 DetailView 中,我可以看到主视图的后退按钮:

struct DetailView: View {
  
    var body: some View {
        Form {
            ...
        }
        .navigationBarTitle("Deatil")
        /*.toolbar {
            ToolbarItem(placement: .primaryAction) {
                
                Button(action: {
                    ...
                }) {
                    Image(systemName: "ellipsis.circle")
                }
                
            }
            
        }*/
    }
}
Run Code Online (Sandbox Code Playgroud)

在我使用工具栏之前一切都很好。然后我只看到工具栏而不是最后一个视图的导航。为什么?通常这应该有效,对吧?

Bra*_* C. 16

我解决了!进一步试验后,我发现通过添加以下工具栏项,您可以防止后退按钮在导航层次结构中深度超过三个视图的刷新视图中消失。

ToolbarItem(placement: .navigationBarLeading) {Text("")}
Run Code Online (Sandbox Code Playgroud)

注意:EmptyView()不会工作。该错误似乎需要一个处于领先位置的活动工具栏项,以防止在视图刷新层次结构中的三个或更多个视图时后退按钮消失。

正如我之前列出的那样,当不使用上面建议的这种新解决方法时,在处理此错误时还需要考虑一些额外的注意事项。

  • navigationBarItems(trailing:) 已弃用
  • 使用 navigationBarItems(trailing:)和toolbar(content:)在相同的 NavigationView层次结构中(即使在不同的视图中)以避免此错误会导致许多视觉故障(重复的后退按钮等)
  • 使用toolbar(content:)它刷新导航层次结构中深度超过三个视图的视图将删除在该层次结构中返回导航的能力(按钮和滑动手势)。
  • 对于它的价值,如果您明确指出trailing工具栏项目的位置并将该项目保留在视图层次结构的前两个视图中,并且您避免使用默认/primaryAction或前导放置以及任何使用 a navigationBarItem,则可以避免大多数这些错误。


lor*_*sum 2

import SwiftUI

struct ToolbarBug: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailViewToolbarBug()) {
                Text("Unknown")
            }
        }
    }
}
struct DetailViewToolbarBug: View {
    var body: some View {
        VStack{
            NavigationLink(destination: DetailViewToolbarBug()) {
                Text("Unknown")
            }
        Form {
            NavigationLink(destination: DetailViewToolbarBug()) {
                Text("Unknown")
            }
            Text("form text")
        }
        }
        .navigationBarTitle("Deatil")
        .toolbar {
            ToolbarItem(placement: .primaryAction) {
                
                Button(action: {
                    
                }) {
                    Image(systemName: "ellipsis.circle")
                }
            }
        }
    }
}
struct ToolbarBug_Previews: PreviewProvider {
    static var previews: some View {
        ToolbarBug()
    }
}
Run Code Online (Sandbox Code Playgroud)