2011年6月7日火曜日

UITabBarControllerのloadViewのタイミング

iOS の UITabBarController でちょっとハマったのでメモ。

UIViewController と UITabBarController とでは loadView, viewDidLoaded のイベントのタイミングが違うみたい。
@interface MyViewController : UIViewController {
}
@end

@implementation MyViewController
- (id) init {
    NSLog(@"super init call!");
    self = [super init];
    if (self) {
        NSLog(@"init call!");
   }
   return self;
}

- (void)loadView {
    [super loadView];
    NSLog(@"loadView call!");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad call!");
}
@end

こんな感じのUIViewController の場合、
1. super init call!
2. init call!
3. loadView call!
4. viewDidLoad call!
の順番で呼ばれます。

... が 継承元を UITabBarController にした場合、つまり上記のコードでinterface部分を
@interface MyViewController : UITabBarController {
}
@end
とした場合は、
1. super init call!
2. loadView call!
3. viewDidLoad call!
4. init call!
の順番で呼ばれるみたい。

なので、UITabBarController の init の所でプロパティの初期化をするようなコードを書いいると、
loadView のタイミングでは初期化されていない という状態になってしまいます。

Tabだからそういうもんかもしれないかもしれないけど、おかしい気もする。うーん ?

私的には
UITabBarControllerを継承してクラスは作成しない方向でこれからは組む
...と心に決めましたw
• • •