【问题标题】:Toolbar is deleting my back Button in the NavigationView工具栏正在删除 NavigationView 中的后退按钮
【发布时间】:2020-10-17 17:04:51
【问题描述】:

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

NavigationView {
    ...
    NavigationLink(destination: DetailView()) {
        Text(entity.name ?? "Unknown")
    }
    ...
}

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

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

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

【问题讨论】:

  • 工具栏是否应该在您的 DetailView 中被注释掉?
  • 为我工作。但是您可以随时尝试其他展示位置,例如 ToolbarItem(placement: .navigationBarTrailing)
  • 确认与 Xcode 12 / iOS 14 一起工作。你使用一些 Xcode 测试版吗?
  • BigSur、Xcode 12 Beta 2、iOS 14.2 中的工程文件
  • 是的,它是 BigSur、Xcode 12 Beta 2 和 iOS 14。如果您有另一个 DetailView2,它是否也适用于您?所以你导航两次。

标签: swift swiftui


【解决方案1】:

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

ToolbarItem(placement: .navigationBarLeading) {Text("")}

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

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

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

【讨论】:

  • 我也遇到过仅与 iPhone 设备相关的问题。该问题似乎不会影响 iPad。
  • 这对我来说并不总是有效。我有时会得到前一个屏幕的标题。所以,它看起来像“
  • 这为我解决了这个问题!是否已经为此提交了错误?
【解决方案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()
    }
}

【讨论】:

  • Lorem,您的代码不会重现该错误,因为您没有在工具栏按钮中放置状态更改/视图刷新操作。如果这样做,您将能够重现该错误。我可以确认这在 Xcode 12.2 中仍然是一个问题。