UIAlertController没有从AppDelegate显示

时间:2015-10-12 06:53:46

标签: ios objective-c cocoa-touch uialertcontroller

我试图在全局范围内(从一个不是视图控制器的地方)呈现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];

4 个答案:

答案 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];