以下のように、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