【UINavigationController】iOS14から追加されたNavigation History Stackを無効化する

iOS, Swift

iOS14からNavigationBarの戻るボタンを長押しすると、2階層以上前の画面にも一気に戻る機能が追加されました。戻るボタンを長押しするとNavigation History Stackと呼ばれるポップアップが表示され戻り先のViewが選べるというものです。

image-20201008192916264.png

この場合に表示されるNavigation History Stackのリストで表示される各文字列は navigationItem.backButtonTitleから動的に取得しているようですが、昨今のアプリでは戻るボタンをピクトグラム(「<」マーク)のみで表示するデザインが多く、その場合、backButtonTitleに空文字を割り当てる実装も多いかと思います。その場合、長押しでNavigation History Stackを表示すると中身が空のリストが表示されてしまうため、挙動として好ましくありません。

それぞれに navigationItem.backButtonTitleを付与して正常に表示されるようにするのが本筋ですが、空リストが表示されないようにするワークアラウンドとしてUIBarButtonItemを以下のようにオーバーライドする方法があるそうです。

setterで何も処理を実行しないというものを上書きすることでリストの中身を保持するプロパティ menuがnilである状態を担保し、Navigation History Stackを表示させないようにするという実装のようです。実際にはこちらのoverrideを実装したラッパークラスをプロジェクト内に追加して、そちらを代用するという実装をしています。

ちなみにこちらの実装が追加された影響なのか、iOS14から戻るボタンのタイトルが空文字の場合に自動で戻る・Back等の文言が補完される仕様が追加されたようです。こちらを無効にするにはUINavigationItemに新しく追加された backButtonDisplayModeというプロパティを以下のように設定すれば良いとのことです。

参考

iOS, Swift