Objective-C
iOS

UIViewControllerのview.windowがロードされるタイミング

More than 3 years have passed since last update.

UIViewController - viewDidLoadでself.view.windowを参照しようとしてハマったのでメモ。iOSは基本的に単一のUIWindowしか持っていないのだけど、UIView.windowで自身が所属するwindowを特定する場合、タイミングが重要な場合がある。例えば以下。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", (vw)); // ない
    NSLog(@"app has window? : %@", (aw)); // ある
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", vw); //ない
    NSLog(@"app has window? : %@",aw); //ある
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", vw); //ある
    NSLog(@"app has window? : %@",aw); //ある
}

UIViewControllerのviewがwindowに所属するのはviewWillApperar:とviewDidAppearの間らしい。ちなみにその時のvwとawは同じオブジェクト。なので、何らかの理由でviewDidLoadでwindowの情報が欲しかったらapplicationDelegate.windowを使いましょう。