我有一个TabView和单独的NavigationView堆栈为每个Tab项。它工作得很好,但当我打开任何NavigationLink时,TabView栏仍然显示。我想它消失,每当我点击任何NavigationLink。
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?(据我所知,导航层次结构中应该只有一个NavigationView)。
如何在SwiftUI中正确隐藏NavigationLink视图中的TabView栏?
7条答案
按热度按时间hmtdttj41#
我真的很喜欢上面的解决方案,但我不喜欢TabBar没有根据视图转换隐藏的事实。在实践中,当您使用tabBar向左滑动以返回导航时。isHidden,则结果不可接受。
我决定给予原生SwiftUI TabView,并编写自己的代码。结果在UI中更漂亮:
下面是用于实现此结果的代码:
首先,定义一些视图:
然后,创建TabBarView(这将是应用中使用的根视图):
该解决方案还允许在TabBar中进行大量自定义。例如,您可以添加一些通知徽章。
yrdbyhpb2#
如果我们讨论标准TabView,可能的变通解决方案可以基于
TabBarAccessor
,我的答案是Programmatically detect Tab Bar or TabView height in SwiftUI下面是保存
NavigationView
的选项卡项中所需的修改。使用Xcode 11测试。4 / iOS 13.4FirstTabView
应该是可重用的,并且可以独立示例化,那么tabBar
属性应该是可选的,并显式处理ansbsent tabBar。*goqiplq23#
感谢另一个Asperi的answer,我能够找到一个解决方案,不破坏动画和看起来 * 自然 *。
动态计算
navigationBarTitle
和navigationBarItems
:xu3bshqb4#
不如这样
exdqitrt5#
iOS 16有一个更新,你现在可以隐藏任何导航栏。在这种情况下:
ny6fqffe6#
我也遇到了这个问题。我不想重写,但解决方案在我的github上。我把所有的细节都写在那里https://github.com/BrotskyS/AdvancedNavigationWithTabView
P.S:我没有写评论的名声。Hikeland的解决方案并不坏。但您不保存页的状态。如果你有一个ScrollView,它会在你每次改变标签时重置为零
uwopmtnx7#
你也可以在TabView中为视图创建非常相似的自定义navBar