Ios 导航视图标题没有';当视图在SwiftUI的选项卡视图中时,不显示

Ios 导航视图标题没有';当视图在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

我有两个视图,每个视图都包含带有标题的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)
}
}

我已尝试隐藏此视图的导航栏,但不起作用。仅显示此视图的导航栏

这是
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))
}