UIAlertView show()行为为UIAlertController

在以前的iOS版本中,我可以在App Delegate的UIAlertView中调用show 。 更具体地说, show被称为:

 func applicationDidBecomeActive(application: UIApplication) 

由于UIAlertView在大多数情况下都忽略了视图层次结构,因此无论用户在应用程序中的哪个位置,该解决scheme都能正常工作。

随着UIAlertController的引入,这个问题变得有点棘手。 UIAlertController现在是UIViewController的子类,需要像其他UIViewController一样呈现。 从keyWindow的rootViewController提供UIAlertController的工作,这不是一个理想的解决scheme。

有没有人有任何想法复制UIAlertController [UIAlertView show]function? 任何方式显示UIAlertController的应用程序活动,而不遍历视图层次结构?

我想出了一个解决scheme,我相信比以前发布的答案更优雅。 我将复制粘贴我发布到类似问题的答案。 按照我的post底部的链接,如果你只是想看到的代码。

解决scheme是使用额外的UIWindow。

当你想显示你的UIAlertController时:

  1. 使你的窗口的关键和可见的窗口( window.makeKeyAndVisible()
  2. 只需使用一个普通的UIViewController实例作为新窗口的rootViewController。 ( window.rootViewController = UIViewController()
  3. 在窗口的rootViewController上展示你的UIAlertController

有几件事要注意:

  • 你的UIWindow必须被强引用。 如果没有强烈引用,它将永远不会出现(因为它被释放)。 我build议使用一个属性,但我也有一个关联的对象的成功。
  • 为了确保窗口出现在其他所有内容(包括系统UIAlertControllers)上,我设置了windowLevel。 ( window.windowLevel = UIWindowLevelAlert + 1

最后,如果你只是想看看,我已经完成了一个实现。

https://github.com/dbettermann/DBAlertController

以下是我最终的结果:

 public class func visibleViewController() -> UIViewController? { return self.visibleViewController(UIApplication.sharedApplication().keyWindow?.rootViewController?) } private class func visibleViewController(viewController: UIViewController?) -> UIViewController? { if viewController?.presentedViewController == nil { println("Visible view controller: \(viewController)") return viewController } else if let navigationController = viewController as? UINavigationController { return self.visibleViewController(navigationController.topViewController) } else if let tabBarController = viewController as? UITabBarController { return self.visibleViewController(tabBarController.selectedViewController) } else { return self.visibleViewController(viewController?.presentedViewController) } } 

尝试这个

  UIAlertController * alert= [UIAlertController alertControllerWithTitle:@"title" message:@" Your message hear" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *okBtnAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ //Do what action u want. [alert dismissViewControllerAnimated:YES completion:nil]; }]; [alert addAction:okAction]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ [alert dismissViewControllerAnimated:YES completion:nil]; //do something when click button }]; [alert addAction:Action]; UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; [vc presentViewController:alert animated:YES completion:nil]; 

尝试使用处理UIAlertView和UIAlertController API的JSAlertView。 它提供简短的方法来显示警报,并同时处理多个警报。