我有一个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栏?
可能的变通方案可以基于以下几点 TabBarAccessor
从我对 在SwiftUI中可编程地检测Tab Bar或TabView的高度。
下面是在标签项中需要修改的地方 NavigationView
. 测试与Xcode 11.4 iOS 13.4
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。