我试图在全局范围内(从一个不是视图控制器的地方)呈现UIAlertController
,但是我的警报没有显示出来。我正在测试我的初始警报,该警报在检测到没有网络后由App Delegate中的可达性测试显示。我可以在屏幕上看到启动图像,但警报没有显示出来。如果我使用UIAlertView
,一切看起来都不错。
如果您遇到类似问题,请告知。
UIAlertController *alert = [UIAlertController alertControllerWithTitle:iTitle message:iMessage preferredStyle:UIAlertControllerStyleAlert];
id rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
if ([rootViewController isKindOfClass:[UINavigationController class]]) {
rootViewController = [((UINavigationController *)rootViewController).viewControllers objectAtIndex:0];
}
dispatch_async(dispatch_get_main_queue(), ^{
[rootViewController presentViewController:alert animated:YES completion:^{
[aBlockSelf alertPresented];
}];
});
修改
为什么我会从AppDelegate
显示
正如我所说,一旦我执行可达性测试,我就会向用户显示警告。即使在加载任何视图控制器之前,也必须在AppDelegate
内执行此测试。所以,我在我的UIWindow
上显示了一个闪屏,我希望我的警报能够显示出来。
当我发出提示时,我的窗口设置是否正确?
是的,我确保我的警报控制器发布窗口设置正确并且在执行以下行之后!
[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
答案 0 :(得分:4)
好吧,我通过创建一个带有空视图控制器的UIWindow
对象并在其中显示警报来解决此问题。显然,一旦警报控制器被解雇,这个临时窗口也会消失。
self.alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.alertWindow.rootViewController = [[UIViewController alloc] init];
self.alertWindow.windowLevel = UIWindowLevelAlert + 1;
[self.alertWindow makeKeyAndVisible];
[self.alertWindow.rootViewController presentViewController:alertControl animated:YES completion:^{
[aBlockSelf alertPresented];
}];
感谢this SO thread,其中提到了WWDC实验室会话: - )!
答案 1 :(得分:1)
从视图控制器发送包含当前视图控制器的通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ShowAlertNotificationKey"
object:self
userInfo:nil];
在AppDelegate中添加一个观察者:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showAlert:)
name:@"ShowAlertNotificationKey"
object:nil];
将呈现AlertController的方法:
- (void)showAlert:(NSNotification *)notification {
UIViewController *viewController = notification.object;
// yourAlertControler..
[viewController presentViewController:yourAlertController animated:YES completion:nil];
}
答案 2 :(得分:1)
对于swift 3.0,这将起作用 -
let topWindow = UIWindow(frame: UIScreen.main.bounds)
topWindow.rootViewController = UIViewController()
topWindow.windowLevel = UIWindowLevelAlert + 1
let alert = UIAlertController(title: "No Network Connection", message: "Please check your connection and try again.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: {(_ action: UIAlertAction) -> Void in
topWindow.isHidden = true
}))
topWindow.makeKeyAndVisible()
topWindow.rootViewController?.present(alert, animated: true, completion: { _ in })
答案 3 :(得分:0)
设置Rootviewcontroller,添加了子视图
[self.window setRootViewController: self.rootViewController];