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