たごもりすメモ

コードとかその他の話とか。

SwiftUIでNavigationStackを使っているとNavigation BarやBackボタンが隠せない? (そんなことなかった)

追記

NavigationViewで一度動くコード作ってからNavigationStackに戻してみたらうまく動いて、期待通りに遷移先でBackボタンがない状態が作れた。

            NavigationStack(path: $path) {
                SplashView()
                    .navigationDestination(for: SigninState.self) { state in
                        Group {
                            switch state {
                            case .notsignedin:
                                SigninView()
                            case .signedin:
                                MainView()
                            }
                        }
                        .navigationBarBackButtonHidden(true)
                    }
            }

この遷移先に.navigationBarBackButtonHiddenをつける方法も試したと思ってたんだけど、たぶん何かでミスってたんだと思う。単に自分のミスだったのかな、ということで、解決しました。

以下オリジナル

タイトルに書いたままなんだけど。 iOSアプリの作り直しをやってて、まあiOS16以降のみ対応でもいいかなと思ったのでビュー遷移に最初からNavigationStackを使おうと思ったんだけど、ユーザに勝手に戻ってほしくない遷移があるのでBackボタンを隠そうと思って以下のようなコードを書いた。

NavigationStack(path: $path) {
    SplashView()
        .navigationBarTitleDisplayMode(.automatic)
        .navigationBarBackButtonHidden(true)
        .navigationDestination(for: SigninState.self) { state in
            Group {
                switch state {
                case .notsignedin:
                    SigninView()
                case .signedin:
                    MainView()
                }
            }
        }
    }
}

んだけど、navigationBarBackButtonHidden(true)ドキュメントにもある通り、どうもNavigationView内でしか効かないみたい。NavigationStackといっしょに指定してもやっぱり遷移先でBackボタンが表示されてしまう。

SwiftUI慣れてないから修飾するビューが違うのかな、と思ってGroup{ ... }の部分に指定してもやっぱりダメ。

あとドキュメントをあれこれ見てると.toolbarで指定しろってあるものもあるので .toolbar(.hidden, for: .navigationBar) を指定してみたりもしたんだけど、やっぱりダメ。なぜだ。現状ナビゲーションバーを隠したりBackボタンを非表示にしたりする方法がないのかな。

なんもわからんのでDeveloper Forumに質問を投げておいた。投げる前に同じ問題が投稿されてなさそうなのはいちおう見てる。

How can I hide navigation bars (or… | Apple Developer Forums