完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
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 29): UIKit環境でのSwiftUIの利用
ここまでの28日間で、あなたはStoryboardとUIKitを「完全に理解」し、どんな複雑なアプリでも構築できるスキルを手に入れました。 しかし、現在のiOS開発の前線には、Appleが圧倒的に推し進めている新世代の宣言的UIフレームワーク、「SwiftUI」 があります。
実際の業務(過去から運用されている大規模な既存アプリ)では、「既存のUIKitコード」と「新機能のためのSwiftUI」を共存(ハイブリッド)させる技術が絶対に必要不可欠です。今日はその魔法の架け橋である UIHostingController を学びます。
1. UIHostingController の魔法
UIKitの世界(ViewController)から見ると、SwiftUIのViewは全く構造が異なる異世界の住人です。そのままでは self.view.addSubview() することもできません。
そこでAppleが用意したのが UIHostingController です。
これは「SwiftUIのViewを包み込み、UIKit側にはただの UIViewController のように振る舞う」というコンテナ(ラッパー)の役割を果たします。
2. 実装:UIKitの画面からSwiftUIの画面へ遷移する
既存のアプリの「設定ボタン」を押した時だけ、新しくSwiftUIで作った設定画面へ遷移させるパターンです。
ステップ1: SwiftUI Viewの作成
まずは普通のSwiftUIファイル(例: SettingsSwiftUIView.swift)を作成します。
swiftimport SwiftUI struct SettingsSwiftUIView: View { var body: some View { Form { Section(header: Text("アカウント")) { Text("ユーザー情報") Text("ログアウト") } } .navigationTitle("SwiftUI設定") } }
ステップ2: UIKit側からの呼び出し
既存のUIKitのViewControllerのボタンアクション内に以下を書きます。
ポイントは、SwiftUIのViewを UIHostingController に食べさせる(引数に渡す)ことです。
swiftimport UIKit import SwiftUI // SwiftUIのインポートが必須です class HomeViewController: UIViewController { @IBAction func settingsButtonTapped(_ sender: UIButton) { // 1. SwiftUIのViewをインスタンス化 let swiftUIView = SettingsSwiftUIView() // 2. それを UIHostingController で包む(ここが魔法!) let hostingController = UIHostingController(rootView: swiftUIView) // 3. あとは普通のUIViewControllerと全く同じように遷移(Push)させるだけ self.navigationController?.pushViewController(hostingController, animated: true) } }
これだけで、UIKitとSwiftUIの間の壁を越えることができます。
3. 実装:UIKitの画面の「一部」としてSwiftUIを埋め込む
画面遷移ではなく、「既存のViewControllerのHeader部分だけをSwiftUIで作り直し、それを埋め込みたい」ケース(Child View Controllerパターン)です。
swift// HomeViewController.swift内 override func viewDidLoad() { super.viewDidLoad() let swiftUIHeader = HeaderSwiftUIView() // SwiftUIで作った部品 let hostingController = UIHostingController(rootView: swiftUIHeader) // 💡 Child View Controller として追加する3ステップ(お約束の書き方) // ① 親子関係の宣言 self.addChild(hostingController) // ② 親のView階層に、HostingControllerの持っているView(中身はSwiftUI)を配置 self.view.addSubview(hostingController.view) // ③ 配置したViewのサイズやAuto Layout制約を決定(例:上部に固定) hostingController.view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ hostingController.view.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), hostingController.view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), hostingController.view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), hostingController.view.heightAnchor.constraint(equalToConstant: 100) ]) // ④ 親子関係の確立を完了 hostingController.didMove(toParent: self) }
少しコード量は多いですが、この「Child View Controller追加の定型文」を覚えれば、どんなUIKitのレガシーコードの中にも、新しくて美しいSwiftUIコンポーネントを安全に注入していくことができます。
📝 今日のまとめ
- UIKitとSwiftUIは完全に共存可能であり、段階的な移行(リプレイス)が実務の標準である。
- 異世界を繋ぐ架け橋となるクラスが
UIHostingControllerである。 UIHostingController(rootView: SwiftUIView())と書くことで、SwiftUIのViewをUIKit世界の「UIViewController」に変換できる。- 変換さえしてしまえば、あとは
pushViewControllerで画面遷移させたり、addChildで画面の一部に埋め込んだりと、UIKitの作法で自由に扱うことができる。
これで、過去(UIKit)からやってきたあなたも、未来(SwiftUI)へいつでも旅立てる切符を手に入れました。 そして明日、いよいよ Day 30 最終回。 今までの29日間の知識の集大成として、1つの具体的なアプリを完成させるまでの実践的なアプローチと設計思想をまとめます!
このシリーズの記事一覧
- 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で完成させる