🪬
UIViewControllerのViewを他のUIViewControllerで表示させる
以下のように、UIViewController の View を他の UIViewController で使用したいという場面が出てきました。

今回はサンプルとして、表示させたい UIViewController は ViewA とし、使用したい UIViewController は ViewB とします。
実装方法
- viewB のインスタンスを作成
- ViewB を ViewA の子として追加
- ViewB の view を ViewA の view の subview に追加
- ViewB に対して処理の終了を通知する
import UIKit
// viewAにviewBを追加したい場合(同じstoryboard)
class ViewA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 1. ViewBのインスタンスを作成
let viewB = storyboard!.instantiateViewController(withIdentifier: "viewB") as! ViewB
// 2. ViewBをViewAの子として追加
self.addChild(viewB)
// 3. ViewBのviewをViewAのviewのsubviewに追加
self.view.addSubview(viewB.view)
// 4. ViewBに対して処理の終了を通知する
viewB.didMove(toParent: self)
}
}

上記のように記述することで、起動した時の ViewA の画面(白い画面)に ViewB(青い画面)が表示されます。
最初は addSubview だけでできると思っていたのですが、addSubview は UIView のメソッドです。
そのため、 UIViewController を追加したい場合は UIViewController を親子関係にする必要があるらしいです。
参考にした記事では addChildViewController と記述されていましたが、Swift のバージョンによって以下のように変更されているようです。
◉ Before:
self.addChildViewController(viewController)
viewController.didMove(toParentViewController: self)
↓
◉ After:
self.addChild(viewController)
viewController.didMove(toParent: self)
【実装MEMO】小さな所から試すSwiftコンバート対応の備忘録 - Fumiya Sakai - Medium より引用
参考記事
- [iOS] カスタムContainerViewControllerを作る : 雑食プログラミング備忘録
- addChild(_:), addSubview(_:)のあとは、didMove(toParent:)を呼びましょう - Qiita
- 自前コンテナでaddChildViewController:するときdidMoveToParentViewController:はやはり使うべき - Qiita
- カスタムContainer View Controllerを作る - Qiita
- ios - value of type 'UIViewController' has no member 'addSubview' Swift2 - Stack Overflow
Discussion