2011年12月1日木曜日

viewDidLoad/viewWillApear/viewDidApear等のタイミング

viewの読み込み・表示の各タイミングでデリゲートが呼び出されるが、
それぞれには重要な意味がある。

特に、nib内容に対する設定、読み出しはviewDidLoad以降でないとすべて無効になる。
中で読み込んでいるUI要素へのデリゲート設定もそう。
これ以前にやってもエラーは出ないのに誤動作する(というか動作しない)のでわかりにくい。

    class=[[ClassName alloc]initWithNibName:@"ClassNibName" bundle:[NSBundle mainBundle]];
    // この先並行動作する
    // nib読み取り終了はviewDidLoadで判定(かなり先になることもある)

    //view表示命令
    [window addSubview:navigationController.view];
とか
[mainView.navigationController popToViewController:self animated:YES];
と記述した場合、

viewDidLoad
Nibの読み込みが実際に終わったときに呼び出される
メモリーオーバーによってViewDidUnloadが呼び出されない限り、初回のみ。

viewDidUnload
メモリーオーバーが発生したときに呼び出される。
不要なワークがあれば、ここで解放する。
次回Viewを表示する際には先にviewDidLoadが呼び出される

viewWillApear
表示直前に呼び出される
要素表示のon/off(.hidden=YES/NO)やラベルの表示内容の設定などはここまでで行う

UIPickerViewのカーソル位置設定はここでしないとうまくいかない
[pickerView_ selectRow:selectRow inComponent:0 animated:NO];

viewDidApear
表示直後に呼び出される
この後Viewへ制御が移る

viewWillDisapear
ビューが消える直前に呼び出される

viewDidDispear
ビューが消えた直後に呼び出される


なお、UIImagePickerControllerのオーバーレイではこれらの処理は通らない。
従って、オーバーレイはnibで作ると制御が難しいため、
オーバーレイではなく、普通のUIViewControllerで作って重ね合わせる方が得策である。


・・・2012/11/30追記
iOS6では細かい呼び出しタイミングが変更になっている。
各処理の終了を待たずに次の処理が走ることがあるのだ。
これに依存している場合は変更が必要になるので注意。





0 件のコメント:

コメントを投稿