🪬

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

に公開

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

ストーリーボードのスクリーンショット

上記のように記述することで、起動した時の 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 より引用

参考記事

Discussion