36

アプリのデリゲートでモーダル ビュー コントローラーを作成しようとしています (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];
}

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

4

7 に答える 7

31

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

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

vC.modalPresentationStyle = UIModalPresentationFormSheet;
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:vC animated:YES];
于 2012-11-12T20:24:32.967 に答える
21

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

これが私がすることです:

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
   activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:loginViewController animated:YES];
于 2014-02-04T09:29:22.200 に答える
8
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];
于 2014-02-18T18:20:52.480 に答える
6

その警告のもう 1 つの理由は、最上位のビュー コントローラーではないインスタンスからビュー コントローラーを提示することです。

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

UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController;
while (root.presentedViewController) {
    root = root.presentedViewController;
}
于 2016-01-21T18:25:23.627 に答える
3

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

rootViewController が通常の UIViewController である場合、私はこの問題に遭遇しました。UINavigationController に置き換えてください。

于 2013-07-24T02:34:19.460 に答える