アプリ開発の逆引き辞典

アプリ開発のTipsをまとめました

SwiftUIで NavigationViewでdisplayModeを指定するとアプリ実行時にクラッシュする

NavigationViewでdisplayModeを指定すると、起動時にアプリがクラッシュした。Xcode 12 beta 2で修正されたようだが、Xcode 11.6であればかならずクラッシュが発生してしまう。

実行環境

  • Xcode 11.6
  • iOS 13.6

問題の挙動

これは実行できる。

struct HomeView : View {
    
    var body: some View {
        NavigationView {
            VStack {
                Text("ねこ")
            }
            .navigationViewStyle(StackNavigationViewStyle())
            .navigationBarTitle(R.string.localizable.home_title())
            .navigationBarItems(leading: Text("設定"))
        }
        .onAppear {
            FA.track(page: "ホーム")
        }
    }
}

これはアプリの実行時にクラッシュする。

struct HomeView : View {

    var body: some View {
        NavigationView {
            VStack {
                Text("ねこ")
            }
            .navigationViewStyle(StackNavigationViewStyle())
            .navigationBarTitle(Text(R.string.localizable.home_title()), displayMode: .inline)
            .navigationBarItems(leading: Text("設定"))
        }
        .onAppear {
            FA.track(page: "ホーム")
        }
    }
}

解決編

Xcode 12 Beta2では修正されているらしいが、Xcode 11.6時点ではナビゲーションバーの透過フラグを false にしているとアプリはクラッシュする。

UINavigationBar.appearance().isTranslucent = false

trueにするとアプリがクラッシュしなくなる。

UINavigationBar.appearance().isTranslucent = true

こんなんわからん。