UIViewContollerの遷移とライフサイクルメソッド

モーダル画面の遷移がある場合のUIViewControllerのライフサイクルメソッドの呼ばれる順に関して混乱したので、再度まとめる。(前にも同じ内容のエントリをポストしたかもしれない)

UIViewController A を表示した後に、UIViewController Bに遷移する場合、メソッドが呼ばれる順は

T UIViewController A UIViewController B UIViewController A
1 -viewWillAppear:
2 -viewDidAppear:
3 -viewWillDisappear: -viewWillAppear:
4 -viewDidAppear: -viewDidDisappear:

となる。

このケースの場合、UIViewController B-viewWillAppear:が呼ばれた時点ではまだUIViewController Aが表示されており、その後同-viewDidAppear:が呼ばれた時点でUIViewController Bが表示されて、UIViewController Aが消える。そしてUIViewController A-viewDidDisappear:が呼ばれる。

コントローラクラスのメソッドが呼ばれたからといって、そのコントローラクラスのインスタンスがWindow制御下(アクティブ)であるとは限らないことに注意が必要だ。(太字がアクティブのコントローラ)
例えば退避しておいたUITabelView BのcontenOffsetをロードする場合等※、現在のコントローラに依存した処理を書く場合、-viewWillAppear:では駄目で-viewDidAppear:で行う必要がある。

※画面のスクロール位置復旧でよく使うイディオム