SwiftUI 隐藏导航链接视图中的 TabView 栏。

问题描述 投票:0回答:1

我有一个TabView和单独的NavigationView堆栈给每个Tab项目。它工作得很好,但当我打开任何导航链接时,TabView栏仍然显示。我希望每当我点击任何一个NavigationLink时,TabView栏就会消失。

struct MainView: View {
    @State private var tabSelection = 0

    var body: some View {
        TabView(selection: $tabSelection) {
            FirstView()
                .tabItem {
                    Text("1")
                }
                .tag(0)
            SecondView()
                .tabItem {
                    Text("2")
                }
                .tag(1)
        }
    }
}

struct FirstView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: FirstChildView()) { // How can I open FirstViewChild with the TabView bar hidden?
                Text("Go to...")
            }
            .navigationBarTitle("FirstTitle", displayMode: .inline)
        }
    }
}

我找到了一个解决方案,把TabView放在NavigationView里面,这样当我点击一个NavigationLink后,TabView栏就会被隐藏。但是这就会把Tab项的NavigationBarTitles搞乱。

struct MainView: View {
    @State private var tabSelection = 0

    var body: some View {
        NavigationView {
            TabView(selection: $tabSelection) {
                ...
            }
        }
    }
}

struct FirstView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: FirstChildView()) {
                Text("Go to...")
            }
            .navigationBarTitle("FirstTitle", displayMode: .inline) // This will not work now
        }
    }
}

在这个解决方案中,要想让每个TabView项有不同的NavigationTabBars,唯一的办法就是使用嵌套的NavigationViews。也许有办法正确实现嵌套的NavigationViews(据我所知,在Navigation hierarchy中应该只有一个NavigationViews)。

如何在SwiftUI中正确地隐藏NavigationLink视图中的TabView栏?

ios swift swiftui
1个回答
1
投票

可能的变通方案可以基于以下几点 TabBarAccessor 从我对 在SwiftUI中可编程地检测Tab Bar或TabView的高度。

下面是在标签项中需要修改的地方 NavigationView. 测试与Xcode 11.4 iOS 13.4

demo

struct FirstTabView: View {
    @State private var tabBar: UITabBar! = nil

    var body: some View {
        NavigationView {
            NavigationLink(destination:
                FirstChildView()
                    .onAppear { self.tabBar.isHidden = true }     // !!
                    .onDisappear { self.tabBar.isHidden = false } // !!
            ) {
                Text("Go to...")
            }
            .navigationBarTitle("FirstTitle", displayMode: .inline)
        }
        .background(TabBarAccessor { tabbar in   // << here !!
            self.tabBar = tabbar
        })
    }
}

注:或当然如果 FirstTabView 应该是可重用的,并且可以独立实例化,那么就应该是 tabBar 里面的属性应该是可选的,并且显式地处理了一个nsbsent tabBar。

© www.soinside.com 2019 - 2024. All rights reserved.