尝试呈现* on *其视图不在窗口层次结构中

我想在我的应用程序委托(我创build了一个名为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]; } 

我如何将视图添加到窗口层次? 或者,我正在做一些非常错误的事情?

你不能从appDelegate显示一个模态视图控制器。 您需要显示一个模式ViewController从viewController当前显示全屏。 换句话说,你需要将该代码放入你的根视图控制器,或者你想要显示模态vc的那个…

此外,你会想要使用方法“presentModalViewController”来呈现模态。 你可以在模态vc上设置属性,如:

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

实际上,只要检测到当前可见的viewController并处理当前控制器是navigationController的情况,就可以从AppDelegate呈现模态视图控制器。

这是我做的:

 UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; if ([activeController isKindOfClass:[UINavigationController class]]) { activeController = [(UINavigationController*) activeController visibleViewController]; } [activeController presentModalViewController:loginViewController animated:YES]; 
 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]; 

我在iOS 7上遇到了这个问题 – 使任何build议的解决scheme工作的关键是打电话

 [self.window makeKeyAndVisible]; 

在你的AppDelegate 。 在那个调用之后,从窗口的rootViewController呈现一个模式视图。

此警告的另一个原因可能是您想要从不是最顶层视图控制器的实例呈现视图控制器。

所以首先你必须得到最高层的UIViewController,并使用这个实例来调用presentViewController:

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

你可以NSLog(@“%@”,self.window.rootViewController),看看rootViewController究竟是什么。

我进入这个问题,当rootViewController是一个正常的UIViewController。 用UINavigationControllerreplace它,希望它会有所帮助。