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:で行う必要がある。
※画面のスクロール位置復旧でよく使うイディオム