Ios 导航视图标题没有';当视图在SwiftUI的选项卡视图中时,不显示
我有两个视图,每个视图都包含带有标题的NavigationView。我创建了一个TabBar视图,它上面还有一个NavigationViewIos 导航视图标题没有';当视图在SwiftUI的选项卡视图中时,不显示,ios,swift,swiftui,navigationview,Ios,Swift,Swiftui,Navigationview,我有两个视图,每个视图都包含带有标题的NavigationView。我创建了一个TabBar视图,它上面还有一个NavigationView struct TabbarView: View { var body: some View { NavigationView{ TabView { MainContentView() .tabItem { VStack { Tex
struct TabbarView: View {
var body: some View {
NavigationView{
TabView {
MainContentView()
.tabItem {
VStack {
Text("Main")
}
}.tag(0)
SearchContentView()
.tabItem {
VStack {
Text("Search")
}
}.tag(1)
}
}.navigationBarBackButtonHidden(true)
.navigationBarHidden(true)
}
}
我已尝试隐藏此视图的导航栏,但不起作用。仅显示此视图的导航栏
这是MainContentView()
}
你知道怎么做吗。谢谢
更新:
基本上,当我点击登录按钮时,我通过NavigationLink传递TabBarView()
NavigationLink(destination: TabbarView()) {
HStack {
Text("Log In")
}
.padding()
.frame(width: geometry.size.width - 40, height: 40)
.foregroundColor(Color.white)
.background(Color.blue)
.cornerRadius(5)
}.padding(.bottom, 40)
在此过程中,它显示了带有子视图的TabbarView(),这就是我看到的:
“Travel”(childView的navigationBarTitle)上方的空间是选项卡栏的navigationBar,因为我将其推入navigationStack
这里首先要指出的是,代码中的所有导航栏修饰符都应该是
导航视图
内部视图上的修饰符,而不是导航视图
本身上的修饰符。从.navigationBarTitle
的文档中,例如:
此修改器仅在该视图位于NavigationView内部且在NavigationView中可见时生效
此外,不需要在MainContentView
中先有一个NavigationView
包装您的TabView
,然后再有一个MainContentView
。这只会导致嵌套的导航栏,您肯定不希望这样。相反,只需使用一个NavigationView
。我还建议您不要将NavigationView
放在MainContentView
正文中
我已经重构了您的代码以显示我所说的内容,尽管我不确定您试图在哪里使用.navigationBarBackButtonHidden
和.navigationBarHidden
,所以我省略了它们。请记住,它们的功能就像.navigationBarTitle
——您需要在NavigationView
内部的视图上使用它们作为修改器,而不是在NavigationView
本身上
struct选项卡视图:视图{
var body:一些观点{
TabView{
导航视图{
MainContentView()
}
.tag(0)
.tabItem{
正文(“主要”)
}
SearchContentView()
.标签(1)
.tabItem{
文本(“搜索”)
}
}
}
}
struct MainContentView:View{
var body:一些观点{
文本(“某些内容视图”)
.navigationBarTitle(“旅行”)
}
}
您可能会注意到,我还从
.tabItem
中删除了VStack
。您可以将文本
和图像
放入.tabItem
中,而不需要VStack
,如果我没有弄错,。tabItem
忽略任何不是文本
或图像
的内容。如果您需要在tabview之前查看登录/注册视图,请不要使用NavigationView包装它。在登录/注册视图中
@EnvironmentObject var authService:AuthService
var body: some View{
ZStack{
if(!authService.isSignedIn){
Button(action: {
self.authService.signIn()
}) {
Text("Login")
}
}
else{
TabBarView()
}
}
}
在子视图中,您可以使用@EnvironmentObject
控制isSignedIn变量,并在注销时更改该值
这是以前使用的TabBarView()
示例:
var body: some View {
TabView {
NavigationView{
FirstView()
}
.tabItem {
VStack{
Image("first")
Text("First")
}
}
NavigationView{
SecondView()
}
.tabItem {
VStack{
Image("second")
Text("Second")
}
}
}
}
这可能是其中一个选项卡:
@EnvironmentObject var authService:AuthService
var body: some View {
TextView("Hello World")
.navigationBarItems(trailing: LogOutButton(logOutFunction: authService.signOut))
}
非常感谢您的详细回答和对概念的解释。我明天会实施。再次感谢!我实现了上面的代码,效果很好。但是,选项卡视图中的子视图仍然显示在屏幕中间。正如在“旅行”标题中显示的,它比实际应该的位置低了几英寸。就好像选项卡栏也有导航栏一样。@osamaneem我没有同样的问题。你能在你的问题中添加一张画布的图片,这样我就可以看到你指的是什么了吗?嘿,我刚刚更新了这个问题。我猜这似乎是一个选项卡栏被推入了navigationStack中。@Andre在子视图中隐藏选项卡栏与此问题无关。此外,隐藏选项卡栏是使用
hidesbottombarwhenpush
完成的,据我所知,目前在SwiftUI中不可用。将选项卡视图
嵌套在导航视图
中不是允许隐藏选项卡栏的方式。这是可以的,但当authService.isSignedIn为true时,不会获得动画效果。它只会在选项卡视图中闪烁。不可爱。
@EnvironmentObject var authService:AuthService
var body: some View {
TextView("Hello World")
.navigationBarItems(trailing: LogOutButton(logOutFunction: authService.signOut))
}