Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

ContainerViewを利用して子のUIViewControllerを切り替える

親のViewControllerのHeaderみたいな感じでUIToolBarをセットして、その下に子供のUIViewControllerをセットしてremove/addで切り替えたら便利そうだと思ってたら、UIViewControllerにはchildviewControllersとかいうプロパティがあり、storyboardではContainer Viewを使ってバインドできることを知った。こいつは便利だ。

で、肝心の切り替えはこんな感じで実装した。Storyboard+AutoLayoutで画面作ってるので、StoryboardのIDを使って初期化することにした。ベタベタだけどこんな感じ。

    func changeContainer(identifier:String) {
        
        //Remove
        var beforeVc: UIViewController = self.childViewControllers[0] as UIViewController
        beforeVc.willMoveToParentViewController(nil)
        beforeVc.view.removeFromSuperview()
        beforeVc.removeFromParentViewController()
        
        //Add
        var afterVc:UIViewController =
            self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as UIViewController
        self.addChildViewController(afterVc)
        self.containerView.addSubview(afterVc.view)
        afterVc.didMoveToParentViewController(self)
        
    }

1つ困ったのがこの作りになってしまうと、ContainerViewのサイズとremove/addしたviewのサイズ連動してくれない。Storyboard上でembedすれば連動してくれるんだけど・・・。まぁでも、containrviewを複数作って切り替えるタイプの作りならすごく便利そう。