当视图位于SwiftUI的TabView中时,导航视图标题不会出现

时间:2019-08-02 15:22:11

标签: ios swift swiftui navigationview

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

enter image description here

2 个答案:

答案 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。您可以将TextImage都放在.tabItem内,而无需使用VStack,如果我没记错的话,.tabItem会忽略任何不符合要求的内容TextImage

答案 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))
}