画面遷移の際に whose view is not in the window hierarchy! となる場合の対処

By | 2015年1月16日

ある画面から別の画面に遷移する際、下記のような警告が表示される場合があります。

2015-01-16 13:41:45.579 ********[17479:7800042] Warning: Attempt to present <UINavigationController: 0x14e540f50> on <UINavigationController: 0x14e60a4f0> whose view is not in the window hierarchy!

これは、表示元の親画面(ViewController)がViewの階層スタックに登録される前に、遷移先の画面を表示しようとした場合が主な原因です。viewDidLoadで画面を遷移させようとしていないでしょうか。 遷移ロジックをviewDidAppearに移してみましょう。

オブザーバーなど通知で飛んできた場合など遷移ロジックによっては画面生成まわり(viewDidLoadやviewDidAppearなど)に遷移ロジックを書かない場合もありますので、上記の方法では対処できません。このような場合は、

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
	// 遷移ロジック
});

このように遷移処理をディレイ(ここでは値0.5にしています)させ、画面生成の間を与えることで対処できるケースがあります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です