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

只要您检测到当前可见的视图控制器并处理当前控制器是导航控制器的情况,您实际上就可以从 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 回答
7

我在 iOS 7 上遇到了这个问题 - 使任何建议的解决方案起作用的关键是调用

[self.window makeKeyAndVisible];

在你的AppDelegate. 在那次通话之后,从窗口中呈现一个模态视图rootViewController就可以了。

于 2014-07-19T09:29:27.990 回答
6

该警告的另一个原因可能是您希望从不是最顶层视图控制器的实例中呈现视图控制器。

所以首先你必须得到最顶层的 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 回答
0

尝试从其他控制器的委托调用中呈现控制器时遇到此问题。即:显示带有委托的搜索过滤器,一旦完成回到我的控制器并通过委托接收数据然后呈现控制器,我所要做的就是在委托中调度当前代码,因为你在另一个线程中,这就是为什么你'正在从主线程在您的视图上呈现来自该另一个线程的另一个控制器,因此必须返回主线程,只需将呈现代码如下:

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

希望这可以帮助 !

于 2018-05-08T13:06:51.213 回答