在 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];
在开发我的 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];