親の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を複数作って切り替えるタイプの作りならすごく便利そう。