完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
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 24): Storyboard Referenceを用いたStoryboard分割
Day 1〜23まで、私たちは全ての画面を Main.storyboard という1つのファイル内で構築してきました(※チュートリアル等でよく見る手法です)。
しかし、実際のプロダクト開発において数十画面を全て1つのStoryboardファイルに詰め込むと、以下の致命的な問題が発生します。
- Gitコンフリクト地獄: 複数人で同時に別々の画面を編集した場合、XMLの競合が発生し高確率で壊れます。
- パフォーマンスの低下: Storyboardファイルを開くたびにMacが悲鳴を上げ、Xcodeの動作が激重になります。
- 視認性の悪化: 矢印(Segue)が複雑に絡み合い、もはやスパゲッティ状態になりフローが追えなくなります。
これを解決・回避するための機能が Storyboard Reference (ストーリーボード・リファレンス) によるファイル分割設計です。
1. 巨大なStoryboardを分割するアプローチ
理想的な設計は、「1つの主要な機能(または1タブ、1画面)につき、1つのStoryboardファイルを作成する」 ことです。 例えば、「ホーム画面用(Home.storyboard)」「設定画面用(Settings.storyboard)」といった具合にファイルを分けます。
既存の画面を別のファイルとして切り出す方法
すでにMain.storyboardに入っている画面を、新しいファイルに切り出して安全にする方法があります。
- テンバス上で、切り出したい画面のViewController(複数選択可)を選択します。
- Xcode上部のメニューバーから
Editor>Refactor to Storyboard...をクリックします。 - 「Save As:」に新しいStoryboardファイル名(例:
Settings.storyboard)を入力し、保存します。 - なんということでしょう!元の
Main.storyboardから該当画面が消え、代わりにStoryboard Referenceという小さな箱(リンク要素)が現れ、矢印(Segue)はそのまま 유지 されました。
これが最も簡単で安全な分割方法です。
2. 新しいファイルからStoryboard Referenceで画面を繋ぐ
一から別々のファイルとして作られた Storyboard 同士を、Segue(矢印)で繋ぐ手順です。ここでは、「ホーム(Home.storyboard)」から「プロフ(Profile.storyboard)」へ画面遷移させたい場合を例にします。
ステップ1: 遷移先(Profile.storyboard)の準備
Profile.storyboardに View Controller を1つ作成します。- その画面の Identity Inspector (⌥⌘3) で、
Storyboard IDを必ず設定します(例:ProfileMainVC)。
ステップ2: 遷移元(Home.storyboard)からのリンク
Home.storyboardを開きます。- ライブラリパネル(
⇧⌘L)からStoryboard Referenceという部品を探し、キャンバスにドロップします。 - 配置した Storyboard Reference を選択し、Attributes Inspector (⌥⌘4) を開きます。
Storyboard項目で、遷移先のファイルであるProfile(拡張子不要)を選択します。Reference ID項目に、ステップ1で設定したProfileMainVCを入力します。- あとは通常の画面遷移と同じです。ホーム画面のボタンから、この Storyboard Reference の箱に対して
Control + ドラッグで繋ぎ、「Show」などのSegueを作成します。
これだけで、異なるStoryboardファイル間での視覚的な画面遷移が完成しました!
3. コードだけで別のStoryboardの画面を呼び出す
Segueを使わずに、プログラムから動的に別のStoryboardファイルに定義された画面を呼び出したい場合(初期起動時のログイン判定後など)の実装です。
swift// 1. "Profile"という名前のStoryboardファイルを読み込む let profileStoryboard = UIStoryboard(name: "Profile", bundle: nil) // 2. そのファイル内から、Storyboard ID "ProfileMainVC" を持った画面をインスタンス化する guard let profileVC = profileStoryboard.instantiateViewController(withIdentifier: "ProfileMainVC") as? ProfileViewController else { return } // 3. NavigationControllerで遷移させる self.navigationController?.pushViewController(profileVC, animated: true)
📝 今日のまとめ
- プロの実務開発においては、1つのStoryboardファイルに画面を詰め込むのは絶対の御法度(アンチパターン) である。
Editor > Refactor to Storyboardを使って、巨大化したStoryboardを機能単位で複数の別ファイルに分割(切り出し)する。- 異なるStoryboardファイルどうしは、
Storyboard Referenceコンポーネントを使って視覚的にSegue接続できる。 - コードから別Storyboardの画面を呼ぶときは
UIStoryboard(name:)し、instantiateViewController(withIdentifier:)を用いる。
この分割手法を身につければ、大規模アプリの複数人開発でもGitのコンフリクトを恐れる必要はありません。 しかし、Storyboardを使わない「1画面=1ファイル」のもう一つのUI構築手法が存在します。明日の Day 25 では、Storyboardの先祖にあたり、今でも特定の場面で強みを発揮する XIB (NIB) ファイルの使い分けを学びます。
このシリーズの記事一覧
- 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で完成させる