[英]SwiftUI - TabView does not hide NavigationBar on first load
我有一个具有“两个根导航”结构的应用程序。 第一个视图(您可以认为是登录屏幕)包含指向其他可关闭的详细视图的导航链接。 其中一个导航链接指向一个 TabView,我想成为一个“新根”导航视图; 意思是,用户不应该能够查看后退按钮或滑动回到第一个视图。 此 TabView 本身具有导航链接,指向其他可关闭对象。
我在 TabView 上使用了.hideNavigationBar()
修饰符来隐藏此视图上的导航,但是后退按钮仍然存在。 但是,如果我切换到另一个选项卡,转到一个详细信息,然后关闭该详细信息,TabBar 会突然尊重这个隐藏的导航栏。 下面粘贴了一个最小的工作示例:
struct BaseView: View {
var body: some View {
NavigationView {
ZStack {
Color.gray
VStack{
Text("Root Navigation View").padding()
NavigationLink(destination: RootTabNavView()) {
Text("To New Root View")
}.padding()
NavigationLink(destination: TestDetailView()) {
Text("To a detail view")
}.padding()
}
}
.hideNavigationBar()
}
}
}
struct RootTabNavView: View {
var body: some View {
ZStack {
TabView {
TestTabView1()
.tabItem {
Text("1")
}
TestTabView2()
.tabItem {
Text("2")
}
}
}
.hideNavigationBar()
}
}
struct TestTabView1: View {
var body: some View {
ZStack {
Color.red
Text("Test Tab View 1 (New Nav Root / Hidden Navigation)")
}
.hideNavigationBar()
}
}
struct TestTabView2: View {
var body: some View {
ZStack {
Color.green
NavigationLink (destination: TestDetailView()) {
Text("To a detail view")
}
}
.hideNavigationBar()
}
}
struct TestDetailView: View {
var body: some View {
ZStack {
Color.purple
Text("A Dismissable Detail")
}
}
}
struct BaseView_Previews: PreviewProvider {
static var previews: some View {
BaseView()
}
}
当应用程序加载时,BaseView 会显示指向 TestDetailView 和 RootTabNavView 的链接。 当导航到 TestDetailView 时,我们会看到顶部的导航栏按预期显示,并且可以返回到 BaseView。 但是,当按下 RootTabNavView 的按钮时,导航选项卡仍然存在(让用户滑开选项卡视图)。 但是,如果我们切换到 Tab 2,转到详细视图,然后关闭该详细视图,则选项卡视图突然有一个隐藏的导航栏。
更有趣的是,如果我向RootTabNavView
导航链接添加isDetailLink(false)
修饰符,选项卡 1 有一个隐藏的导航栏,但是当我切换到选项卡 2 时它会重新出现,只有当我转到细节并关闭时,它才会再次隐藏。
这是 SwiftUI 中的错误吗? 我是否配置错误? .hideNavigationBar()
或isDetailLink()
的行为方式我不知道吗?
TabView
被设计为根视图,否则可能会表现得很奇怪。 它还在开始时加载多个选项卡,因此每个用于相同目的的不同修饰符可能会发生冲突。
在这种情况下,更好的方法是将初始NavigationView
替换为新的根视图 ( TabView
) 和转换(模仿导航)。
使用 Xcode 13.4 / iOS 15.5 测试
这是主要部分:
ZStack {
if showRoot {
RootTabNavView()
.transition(.move(edge: .trailing))
} else {
NavigationView {
ZStack {
Color.gray
VStack{
Text("Root Navigation View").padding()
Button(action: { showRoot = true }) {
Text("To New Root View")
}.padding()
NavigationLink(destination: TestDetailView()) {
Text("To a detail view")
}.padding()
}
}
.navigationTitle("") // << hide !!
.navigationBarHidden(true) // << hide !!
}
.transition(.asymmetric(insertion: .identity, removal: .move(edge: .leading)))
}
}.animation(.default, value: showRoot)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.