UIViewControllerのViewを他のUIViewControllerで表示させる

UIViewControllerのViewを他のUIViewControllerで表示させる iOS

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

ViewAのviewに、ViewBのviewを表示したい!!

今回はサンプルとして表示させたいUIViewControllerはViewAとし、使用したいUIViewControllerはViewBとします。

実装方法

  1. viewBのインスタンスを作成
  2. ViewBをViewAの子として追加
  3. ViewBのviewをViewAのviewのsubviewに追加
  4. 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)
    }
}
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 より引用

参考記事