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时:
- 使你的窗口的关键和可见的窗口(
window.makeKeyAndVisible()
) - 只需使用一个普通的UIViewController实例作为新窗口的rootViewController。 (
window.rootViewController = UIViewController()
) - 在窗口的rootViewController上展示你的UIAlertController
有几件事要注意:
- 你的UIWindow必须被强引用。 如果没有强烈引用,它将永远不会出现(因为它被释放)。 我build议使用一个属性,但我也有一个关联的对象的成功。
- 为了确保窗口出现在其他所有内容(包括系统UIAlertControllers)上,我设置了windowLevel。 (
window.windowLevel = UIWindowLevelAlert + 1
)
最后,如果你只是想看看,我已经完成了一个实现。
以下是我最终的结果:
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。 它提供简短的方法来显示警报,并同时处理多个警报。