完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
S7r1n9y
Engineer
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Sponsored
完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
Day 8でSegueを使った画面遷移を学びましたが、標準の「Show」Segueを使っても、下からモーダルで表示されるだけで「右からスライドして入り、左上の< Backで戻る」というお馴染みの動きになりませんでした。
これは、履歴を管理する箱である UINavigationController が存在しないためです。
1. UINavigationController とは?
UINavigationController は、他のViewControllerを管理するための特別なコンテナ(入れ物)ViewControllerです。
データを管理する構造として スタック(LIFO: 後入れ先出し) を使用します。
- 画面を被せる(遷移する)処理を Push(プッシュ) と呼びます。
- 画面を取り除く(戻る)処理を Pop(ポップ) と呼びます。
主な役割
- ナビゲーションバーの提供: 画面上部の帯(NavigationBar)を表示し、タイトルや戻るボタンを自動生成します。
- 履歴の保持: 今までにPushされた画面の順序をメモリに保持し、正常な「戻る」ルーティングを保証します。
2. Storyboardでの導入方法
Storyboardへの導入は驚くほど簡単です。これだけのために新しいコードは不要です。
- アプリの起点となる(最初の)ViewControllerを選択します。
- メニューバーから
Editor>Embed In>Navigation Controllerを選択します。 - 自動的にNavigation Controllerがキャンバスに追加され、元の画面の表示領域上部にナビゲーションバーが現れます。
これだけで導入完了です!
この状態で、Day 8で設定した「Show」のSegueを再度実行してみてください。今度は下からではなく、右から華麗にスライドインし、左上には元の画面に戻るための < ボタンが自動生成されるはずです。
3. ナビゲーションバーのカスタマイズ(Storyboard)
タイトルの設定
ナビゲーションバーの中央にタイトルを表示したい場合は、各ViewController上のナビゲーションバー部分にあたる Navigation Item をクリック(またはドキュメントアウトラインから選択)し、Attributes Inspectorで Title を入力します。
Large Title(ラージタイトル)
iOS 11から導入された、画面をスクロールすると縮む大きな太字タイトルの設定です。
- 一番大元にある Navigation Controller を選択します。
- ナビゲーションバー部分をクリックします(または Navigation Bar を選択)。
- Attributes Inspectorで
Prefers Large Titlesにチェックを入れます。
Bar Button Item(ボタンの追加)
「保存」「+(追加)」といったボタンをバーの右端・左端に配置できます。
- ライブラリパネル(
⇧⌘L)から Bar Button Item をドラッグし、ナビゲーションバーの右側か左側にドロップします。 - System Itemを
AddやTrash等に変更すると、システム標準のアイコンが利用できます。
4. コードでの制御 (Push / Pop)
Segueを使わずにコード上でナビゲーションの階層を操作することもよくあります。
その場合、各ViewControllerが持っている navigationController プロパティ経由で操作します。
Push (新しい画面へ進む)
Segueを使わない場合の画面遷移コードです。
swift@IBAction func goNextButtonTapped(_ sender: UIButton) { // 1. StoryboardからViewControllerのインスタンスを生成 let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController else { return } // データ渡し detailVC.selectedItemName = "Apple" // 2. NavigationControllerにPushしてもらう self.navigationController?.pushViewController(detailVC, animated: true) }
Pop (前の画面に戻る)
ユーザーが左上の「戻る」ボタンを押したとき以外にも、保存処理が完了したタイミング等にコードで画面を消したい場合に使します。
swift@IBAction func saveButtonTapped(_ sender: UIButton) { // データを保存する処理... // 1つ前の画面に戻る self.navigationController?.popViewController(animated: true) } func cancelToTop() { // 先頭の画面(一番最初の画面)まで一気に戻る self.navigationController?.popToRootViewController(animated: true) }
📝 今日のまとめ
- UINavigationController は、複数の画面を「スタック」として階層管理するコンテナ。
- Storyboard上で
Editor > Embed Inから一発で導入できる。 - 導入すると、画面上部にナビゲーションバーと「戻る」ボタンが自動付与される。
- コードで遷移・戻る場合は
pushViewControllerとpopViewControllerを使う。
階層的な「奥へ進む」遷移ができるようになりました。 しかし、iOSアプリのナビゲーションにはもう一つ重要なパターンがあります。画面下部にアイコンが並ぶ「タブ」構造です。 明日の Day 10 では、UITabBarController を使った並列ナビゲーションについて学びます。
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる