web-dev-qa-db-ja.com

ビューがウィンドウ階層にない* on *を提示しようとする

アプリデリゲートでモーダルビューコントローラーを作成しようとしています(showLoginViewという関数を作成しました)。しかし、それを呼び出そうとするたびに、XCodeで警告が表示されます。

Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy!

メソッドコードは次のとおりです。

- (void)showLoginView
{
    PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"];
    [self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil];
}

ビューをウィンドウ階層に追加するにはどうすればよいですか?それとも私は何か非常に間違っているのでしょうか?

36
patryk

AppDelegateからモーダルビューコントローラーを表示することはできません。現在全画面を表示しているviewControllerからモーダルViewControllerを表示する必要があります。言い換えれば、そのコードをルートビューコントローラー、またはモーダルvcを表示したいものに配置する必要があります...

また、メソッド「presentModalViewController」を使用してモーダルを表示することもできます。次のようなプロパティをモーダルvcに設定できます。

vC.modalPresentationStyle = UIModalPresentationFormSheet;
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:vC animated:YES];
30
HackyStack

現在表示されているviewControllerを検出し、現在のコントローラーがnavigationControllerである場合を処理する限り、実際にAppDelegateからモーダルビューコントローラーを提示できます。

ここに私がやることがあります:

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
   activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:loginViewController animated:YES];
21
Erwan
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]])
{
   activeController = [(UINavigationController*) activeController visibleViewController];
}
else if (activeController.modalViewController)
{
    activeController = activeController.modalViewController;
}
[activeController presentModalViewController:vc animated:YES];
8
SFeng

私はiOS 7でこの問題に遭遇しました-提案されたソリューションのいずれかを機能させるための鍵は電話することでした

[self.window makeKeyAndVisible];

AppDelegateで。その呼び出しの後、ウィンドウのrootViewControllerからのモーダルビューの表示が機能しました。

7
David Ganster

この警告の別の理由として、最上位のView ControllerではないインスタンスからView Controllerを表示したいことが考えられます。

したがって、最初に最上位のUIViewControllerを取得し、このインスタンスを使用してpresentViewControllerを呼び出す必要があります。

UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController;
while (root.presentedViewController) {
    root = root.presentedViewController;
}
6
Titus T

NSLog(@ "%@"、self.window.rootViewController)で、rootViewControllerが実際に何であるかを確認できます。

RootViewControllerが通常のUIViewControllerであるときに、この問題が発生しました。 UINavigationControllerに置き換えてください。

3
Sanbrother

他のコントローラーのデリゲートの呼び出しからコントローラーを提示しようとしたときに、この問題に直面しました。すなわち、デリゲートで検索フィルタを表示し、コントローラに戻ってデータを受信し、デリゲートを介してコントローラを提示し、デリゲートで別のスレッドにいる間に現在のコードの原因をディスパッチするだけでよいので、 'メインスレッドからあなたのビューに他のスレッドから別のコントローラを提示しているので、メインスレッドに戻る必要があります、提示コードを次のように置くだけです:

     dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:searchVC animated:true completion:nil];
 });

お役に立てれば !

0
IsPha