makotton.com

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

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

[bash getter=”0″]
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!
[/bash]

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

[adsense]

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

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

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

モバイルバージョンを終了