在 App Delegate 中显示警报的方法失败,因为它的 rootViewController 不在 View Hierarcy 中

Posted

技术标签:

【中文标题】在 App Delegate 中显示警报的方法失败,因为它的 rootViewController 不在 View Hierarcy 中【英文标题】:Method showing alert in App Delegate fails because it's rootViewController is not in the View Hierarcy 【发布时间】:2015-10-28 11:06:28 【问题描述】:

在我的 ios 应用程序开发过程中,如果出现严重错误,我希望能够向用户显示一个对话框。

在 SO 上,发现这可以通过在我的 AppDelegate 类中添加类似以下内容来实现

- (void) notifyUserAboutSeriousBugWithMessage:(NSString *)message 
    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Serious bug: Alert developer"
                                                                   message:message
                                                            preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) ];
    [alert addAction:defaultAction];

    [self.window.rootViewController presentViewController:alert animated:YES completion:^];

但是,当我运行它时,我收到一条错误消息,说我是 Attempting to present <A> on <B> whose view is not in the window hierarchy!

我的应用程序正在使用情节提要,Entry/Start point <B> 是启动画面 (-viewController)。 [这不包含在 NavigationController 中]

完成启动画面后,我使用模态转场来显示应用程序的“其余部分”。

那么我该如何解决这个问题?在我的应用程序委托中,我想获得一些将在视图层次结构中的视图控制器,并在它的视图中显示我的警报。

(我想把它放在应用程序委托中的原因是我想从不是视图控制器的类中显示错误警报)

谢谢!

【问题讨论】:

【参考方案1】:

这可能是因为您已经在rootViewController 之上显示了viewController。您需要在最顶层的视图控制器上显示您的警报。

以下是获取最顶层控制器的方法:

UIViewController *topViewController = self.window.rootViewController;
while (topViewController.presentedViewController) 
    topViewController = topViewController.presentedViewController;

你可以这样做:

[topViewController presentViewController:alert animated:YES completion:nil];

【讨论】:

做到了。谢谢。

以上是关于在 App Delegate 中显示警报的方法失败,因为它的 rootViewController 不在 View Hierarcy 中的主要内容,如果未能解决你的问题,请参考以下文章

在 App Delegate 上调用服务器后如何更改根控制器?

App Delegate 的问题它释放了变量

Xcode Interface Builder 未显示 App Delegate 对象

是否可以在另一个共享对话框的顶部显示警报消息

如果网络请求失败,如何在流的基础上显示警报对话框

jquery 移动委托警报显示页面名称 - 如何删除?