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

fdbelqdn  于 2023-09-30  发布在  Swift
关注(0)|答案(4)|浏览(119)

我有两个视图,每个视图都包含带有标题的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(),这是我看到的:“Travel”(childView的navigationBarTitle)上方的空间是选项卡栏的navigationBar,因为我将其推入navigationStack。

2q5ifsrm

2q5ifsrm1#

首先要指出的是,代码中的所有导航栏修饰符都应该是NavigationView内部视图上的修饰符,而不是NavigationView本身上的修饰符。从.navigationBarTitle的文档中,例如:
此修改器仅在此视图位于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")
    }
}

您可能已经注意到,我还从.tabItem中删除了VStack。您可以将TextImage都放入.tabItem中,而不需要VStack,如果我没有弄错的话,.tabItem会忽略任何不是TextImage的内容。

bxpogfeg

bxpogfeg2#

如果您需要在tabview之前使用Login/SignUp View,请不要使用NavigationView Package 它。在登录/注册视图中

@EnvironmentObject var authService:AuthService

var body: some View{
    ZStack{
        if(!authService.isSignedIn){
            Button(action: {
                self.authService.signIn()
            }) {
                Text("Login")
            }
        }
        else{
            TabBarView()
        }
    }
}

在子视图中,您可以使用@EnvironmentObject控制 isSignedIn 变量,并在Signed Out时更改该值。

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))
}
v9tzhpje

v9tzhpje3#

在iOS 13中也是如此:

var body: some View {
        TabView {
            NavigationView {
                FirstTabbarView(viewModel: viewModel)
                    .navigationBarTitle("NavBar title Tabbar1", displayMode: .inline)
            }
            .tabItem {
                Image(systemName: "house.fill")
                Text("Tab bar 1")
            }
            
            NavigationView {
                SecondTabbarView(viewModel: viewModel)
                    .navigationBarTitle("Navbar title Tabbar 2", displayMode: .inline)
            }
            .tabItem {
                Image(systemName: "person.fill")
                Text("Tab bar 2")
            }
            
        }
    }
7kjnsjlb

7kjnsjlb4#

如果您想要动态导航标题,您可以这样做

struct ContentView: App {
@State var selection = 1

var body: some Scene {
    WindowGroup {
        NavigationView {
            TabView(selection: $selection) {
                GridView()
                    .tabItem {
                        Label("Study", systemImage: "book")
                            .symbolRenderingMode(.hierarchical)
                    }
                    .tag(1)
                
                StudyView()
                    .tabItem {
                        Label("Test", systemImage: "graduationcap")
                    }
                    .tag(2)
            }
            .navigationTitle(selection == 1 ? "Study a Language" : "Take a Test")
        }
    }
}

另外,如果您收到这样的警告尝试弹出到丢失的目的地- SwiftUI/NavigationBridge_PhoneTV.swift:213您可能可以关注此博客https://computerlounge.it/swifui-trying-to-pop-to-missing-destination/

相关问题