在 App Delegate 中显示警报的方法失败,因为它的 rootViewController 不在视图层次结构中

Method showing alert in App Delegate fails because it's rootViewController is not in the View Hierarcy

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

在 SO 上,发现可以通过向我的 AppDelegate 添加类似以下内容来实现此目的 class

- (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 中]

当我完成启动画面后,我使用模式转场显示应用程序的 "the rest"。

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

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

谢谢!

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

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

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

然后您可以这样做:

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