2つのビューがあり、それぞれにタイトル付きのNavigationViewが含まれています。 NavigationViewもあるTabBarビューを作成しました。
_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")
}
_
}
これにどう対処するかについてのアイデア。ありがとう!
更新:基本的に、Log Inボタンをタップすると、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)の上のスペースは、navigationStackにプッシュしているので、タブバーのnavigationBarです。
ここで最初に指摘することは、コード内にあるすべてのナビゲーションバー修飾子は、NavigationView
自体の修飾子ではなく、NavigationView
内のビューの修飾子でなければならないということです。 .navigationBarTitle
のドキュメントから、たとえば:
この修飾子は、このビューがNavigationViewの内部にあり、NavigationView内に表示されている場合にのみ有効です。
また、NavigationView
をラップしてTabView
をラップし、次にMainContentView
をラップする必要はありません。これは入れ子になったナビゲーションバーにつながるだけで、絶対にそれを望まないでしょう。代わりに、1つの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
も削除しました。 Text
を必要とせずに、Image
とVStack
の両方を.tabItem
内に置くことができます。私が誤っていない場合、.tabItem
は何も無視しますとにかくText
やImage
ではありません。
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")
}
}
}
}
_
これはタブビューの1つである可能性があります。
_@EnvironmentObject var authService:AuthService
var body: some View {
TextView("Hello World")
.navigationBarItems(trailing: LogOutButton(logOutFunction: authService.signOut))
}
_