在 SwiftUI 中的多个导航视图的情况下隐藏导航栏

Posted

技术标签:

【中文标题】在 SwiftUI 中的多个导航视图的情况下隐藏导航栏【英文标题】:Hiding Navigation Bar in case of multiple Navigation Views in SwiftUI 【发布时间】:2020-06-30 11:52:32 【问题描述】:

如果有多个导航视图,我无法隐藏导航栏。我希望导航栏出现在第一个和第二个屏幕上,但不在第三个屏幕上。

struct FirstView: View 

    init() 
        UINavigationBar.appearance().backgroundColor = UIColor.green
    

    var body: some View 
        NavigationView 
                NavigationLink(destination: SecondView()) 
                    Text("Second View")
            .navigationBarTitle("First View")
        
    

 
// Second View

struct SecondView: View 
    var body: some View 
        NavigationLink(destination: ThirdView()) 
            Text("Third View")
        
    


// Third View 

struct ThirdView: View 

    var body: some View 
        
            Text("Welcome")
            .navigationBarTitle("")
            .navigationBarHidden(true)
        
    

我尝试使用上述代码将导航栏隐藏在第三个屏幕上,但它不起作用:(

【问题讨论】:

每个导航堆栈应该只有 一个 NavigationView。 【参考方案1】:

如果您想在第三个视图中完全隐藏导航栏,可以采用这种方法。 (注意:顺便说一句,在一个视图层次结构中必须只有一个 NavigationView,因此在 ThirdView 中不需要另一个

使用 Xcode 11.4 / ios 13.4 测试

class HideBarViewModel: ObservableObject 
    @Published var isHidden = false


struct FirstView: View 
    @ObservedObject var vm = HideBarViewModel()
    init() 
        UINavigationBar.appearance().backgroundColor = UIColor.green
    

    var body: some View 
        NavigationView 
                NavigationLink(destination: SecondView()) 
                    Text("Second View")
            .navigationBarTitle("First View")
            .navigationBarHidden(vm.isHidden)
        .environmentObject(vm)
    


// Second View

struct SecondView: View 
    var body: some View 
        NavigationLink(destination: ThirdView()) 
            Text("Third View")
        
    


// Third View

struct ThirdView: View 
    @EnvironmentObject var vm: HideBarViewModel
    var body: some View 
        Text("Welcome")
            .onAppear 
                self.vm.isHidden = true
            
    

【讨论】:

它如何帮助我隐藏第三屏的导航栏?您建议的解决方案也只是将标题添加到第二个屏幕。尝试了您的解决方案,但它没有解决我想要实现的目标:(

以上是关于在 SwiftUI 中的多个导航视图的情况下隐藏导航栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 SwiftUI 中的 NavigationButton 的情况下导航到 NavigationView 中的另一个视图?

带有列表的 SwiftUI 自定义导航栏

如何在没有导航回溯的情况下启动 SwiftUI 视图?

SwiftUI - 视图获取隐藏在导航栏下

如何在 SwiftUI 的标签栏的特定视图中隐藏导航栏?

SwiftUI 和双导航栏