我有两个视图,每个视图都包含带有标题的NavigationView。我创建了一个TabBar视图,上面也带有NavigationView。
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)
}
}
我尝试隐藏此视图的navigationBar,但这不起作用。仅显示此视图的导航栏。
这是MainContentView()
struct MainContentView: View {
var body: some View {
NavigationView {
Text("Some Content View")
}
.navigationBarTitle("Travel")
}
}
任何想法如何解决。谢谢!
更新: 基本上,当我点击登录按钮时,我正在通过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(),这就是我看到的: 因为我将其推入navigationStack中,所以“旅行”上方的空间(childView的navigationBarTitle)是标签栏的navigationBar。
答案 0 :(得分:6)
这里要指出的第一件事是,您代码中的所有导航栏修饰符应该是NavigationView
内部视图上的修饰符,而不是NavigationView
本身上的修饰符。例如,来自.navigationBarTitle
的文档中:
仅当此视图在NavigationView中并在NavigationView中可见时,此修饰符才会生效。
此外,也不需要NavigationView
包装您的TabView
,然后再包装MainContentView
中的另一个。这只会导致嵌套的导航栏,而您绝对不希望那样。相反,只需使用一个NavigationView
。我还建议您不要将NavigationView
放在MainContentView
正文中。
尽管我不确定您在哪里尝试使用.navigationBarBackButtonHidden
和.navigationBarHidden
,但我已经重构了您的代码以显示我在说什么,因此我省略了它们。请记住,它们的功能就像.navigationBarTitle
一样-您需要将它们用作NavigationView
内部视图的修饰符,而不是NavigationView
本身。
struct TabBarView: View {
var body: some View {
TabView {
NavigationView {
MainContentView()
}
.tag(0)
.tabItem {
Text("Main")
}
SearchContentView()
.tag(1)
.tabItem {
Text("Search")
}
}
}
}
struct MainContentView: View {
var body: some View {
Text("Some Content View")
.navigationBarTitle("Travel")
}
}
您可能会注意到,我还从VStack
中删除了.tabItem
。您可以将Text
和Image
都放在.tabItem
内,而无需使用VStack
,如果我没记错的话,.tabItem
会忽略任何不符合要求的内容Text
或Image
。
答案 1 :(得分:1)
如果在tabview之前需要Login / SignUp View,请不要使用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))
}