iOS 5でviewWillAppear:がaddSubview:しただけで呼ばれる


iOSアプリで、起動時処理の定型に、UIViewControllerのインスタンスを作成してウインドウにaddSubview:する、というものがある。iOS 4までは、これだとUIViewControllerのviewWillAppear:とかが呼ばれないので、自前で呼ぶというのが必要だった。

// Add controller
[_window addSubview:_viewController.view];

// Call viewWillAppear: and viewDidAppear:
[_viewController viewWillAppear:NO];
[_viewController viewDidAppear:NO];

んが、iOS 5になったら、addSubview:するだけでviewWillController:とかが呼ばれるようになってしまった。ある意味ありがたい。だけど、iOS 4とiOS 5の両方で動かそうとすると、問題が発生する。iOS 5だとviewWillAppear:が連続して2回呼ばれてしまうのだ。ある意味ありがた迷惑である。

となると、実行時にOSのバージョン調べて呼び分けるしかねーな。たとえば、iOS 5から追加されたメソッドを使って、判定する事ができる。

// Add controller
[_window addSubview:_viewController.view];

// For prior to 5.0
if (![_viewController respondsToSelector:@selector(willMoveToParentViewController:)]) {
    // Call viewWillAppear: and viewDidAppear:
    [_viewController viewWillAppear:NO];
    [_viewController viewDidAppear:NO];
}

これで期待通りの動きになる。ま、viewWillAppear:を2回連続で呼ばれても問題ないようにするべきなのかもしれんが、それはそれでいろいろあるし。

iOS 5専用にしちまえば問題はなくなるんだけど、現実問題そうもいかん。Appleの前バージョン切り捨ては容赦ないな。

  1. コメントはまだありません。

  1. トラックバックはまだありません。