iOS14からNavigationBarの戻るボタンを長押しすると、2階層以上前の画面にも一気に戻る機能が追加されました。戻るボタンを長押しするとNavigation History Stackと呼ばれるポップアップが表示され戻り先のViewが選べるというものです。
この場合に表示されるNavigation History Stackのリストで表示される各文字列は navigationItem.backButtonTitleから動的に取得しているようですが、昨今のアプリでは戻るボタンをピクトグラム(「<」マーク)のみで表示するデザインが多く、その場合、backButtonTitleに空文字を割り当てる実装も多いかと思います。その場合、長押しでNavigation History Stackを表示すると中身が空のリストが表示されてしまうため、挙動として好ましくありません。
それぞれに navigationItem.backButtonTitleを付与して正常に表示されるようにするのが本筋ですが、空リストが表示されないようにするワークアラウンドとしてUIBarButtonItemを以下のようにオーバーライドする方法があるそうです。
@available(iOS 14.0, *) override var menu: UIMenu? { get { super.menu } set { } } |
setterで何も処理を実行しないというものを上書きすることでリストの中身を保持するプロパティ menuがnilである状態を担保し、Navigation History Stackを表示させないようにするという実装のようです。実際にはこちらのoverrideを実装したラッパークラスをプロジェクト内に追加して、そちらを代用するという実装をしています。
ちなみにこちらの実装が追加された影響なのか、iOS14から戻るボタンのタイトルが空文字の場合に自動で戻る・Back等の文言が補完される仕様が追加されたようです。こちらを無効にするにはUINavigationItemに新しく追加された backButtonDisplayModeというプロパティを以下のように設定すれば良いとのことです。
navigationItem.backButtonDisplayMode = .minimal |
参考
- 戻るボタンの長押し – iOS 14対応で気をつけるべきこと
- Disabling the menu for the UIBarButtonItem back button – Apple Developer Forums
- What should you know about a navigation history stack in iOS 14
- A new way to manage the back button title in iOS 14 with backButtonDisplayMode
この記事を書いた人
- 2019年新卒のエンジニアです.iOS修行中.