web-dev-qa-db-ja.com

ビューがSwiftUIのTabViewにある場合、NavigationViewタイトルが表示されない

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です。

enter image description here

9
Osama Naeem

ここで最初に指摘することは、コード内にあるすべてのナビゲーションバー修飾子は、NavigationView自体の修飾子ではなく、NavigationView内のビューの修飾子でなければならないということです。 .navigationBarTitleのドキュメントから、たとえば:

この修飾子は、このビューがNavigationViewの内部にあり、NavigationView内に表示されている場合にのみ有効です。

また、NavigationViewをラップしてTabViewをラップし、次にMainContentViewをラップする必要はありません。これは入れ子になったナビゲーションバーにつながるだけで、絶対にそれを望まないでしょう。代わりに、1つのNavigationViewを使用してください。また、NavigationViewMainContentView本文内に配置しないことをお勧めします。

.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を必要とせずに、ImageVStackの両方を.tabItem内に置くことができます。私が誤っていない場合、.tabItemは何も無視しますとにかくTextImageではありません。

10
graycampbell

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))
}
_
1
Daniel Bastidas