OS5から使えるようになった、UIViewControllerのContainer。
これらを使ってUIViewControllerの親子関係が実現できるのは周知の通り。
(参考: View Controller Programming Guide for iOS)
-(void)addChildViewController:(UIViewController *)childController -(void)removeFromParentViewController -(void)willMoveToParentViewController:(UIViewController *)parent -(void)didMoveToParentViewController:(UIViewController *)parent
何が嬉しいかと言えば、以下のviewメソッド四兄弟を適宜呼び出してくれる。確かに便利。
-(void)viewWillAppear:(BOOL)animated -(void)viewWillDisappear:(BOOL)animated -(void)viewDidAppear:(BOOL)animated -(void)viewDidDisappear:(BOOL)animated
そのコンテナ構造は、以下のような関係を想定して作られている(それぞれUIViewController)。
Parent
|-- Child1
|-- Child2
|-- …
で、ParentのviewにChild1やChild2のviewがのることでUIを構成するわけだが、
この時、上記の四兄弟メソッドが呼ばれるのは、viewが追加/削除されたタイミングであって
その対象は、当然ながら、追加/削除されたviewを管理するUIViewControllerのみである。
つまり、上の親子関係であれば、ParentのviewWillAppear:等は
コンテナ関係の操作をしても呼ばれない。
これは何もParentに限ったことではなく、
Child1のviewの上にChild2のviewを追加し、その後に削除したとしても
呼ばれるのはChild2のviewWillDisappear:/viewDidDisappear:だけであり、
Child1のviewWillAppear:/viewDidAppear:は呼ばれない。
この辺りがナビゲーションなどとは挙動が異なる。
全部自動でやってくれるかと思ったら、案外そうでもなかった、良くあるパターン。
期待し過ぎであり、勘違いのせいでもあるけれど。
え? 四兄弟メソッドなんて、必要であれば自分で呼べば良いだけだって?
——それを言ったらおしまいじゃないの。
手動でやると二重に呼ばれたりして大変なことになったりもするし(経験談)。
できるだけ、元々ある仕組みを利用して楽をしたい、そんなコンセプト。