在我的应用中,有些情况可能会出现多个警报。但是在iOS8 UIAlertview转向UIAlertController时,我无法显示多个警报,因为您无法同时显示两个或更多控制器。
如何使用UIAlertController实现此目的?
答案 0 :(得分:8)
以下是显示多个alertControllers的方法:
UIAlertController *av = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:kAlertOk
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
}];
[av addAction:cancelAction];
UIWindow *alertWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
alertWindow.rootViewController = [[UIViewController alloc]init];
alertWindow.windowLevel = UIWindowLevelAlert + 1;
[alertWindow makeKeyAndVisible];
[alertWindow.rootViewController presentViewController:av animated:YES completion:nil];
答案 1 :(得分:4)
您可以跟踪要在视图控制器中显示的警报列表作为实例变量,例如
NSMutableArray *alertsToShow;
您可以展示第一个UIAlertController,并添加一个UIAlertAction,在其中使用类似递归的方法呈现下一个警报(如果适用):
- (void)showAlertIfNecessary {
if (alertsToShow.count == 0)
return;
NSString *alert = alertsToShow[0];
[alertsToShow removeObjectAtIndex:0];
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:@"Title"
message:alert
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action)
{
[self showAlertIfNecessary];
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
请注意,如果用户需要点击大量消息,这会让用户感到非常恼火。您可以考虑将它们合并为一条消息。
答案 2 :(得分:3)
@ Bejibun上面回答的Swift版本:
let alertView = UIAlertController(title: "New Message", message: "Message Body", preferredStyle: .Alert)
alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) in
alertView.dismissViewControllerAnimated(true, completion: nil)
}))
let alertWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
alertWindow.rootViewController = UIViewController()
alertWindow.windowLevel = UIWindowLevelAlert + 1
alertWindow.makeKeyAndVisible()
alertWindow.rootViewController?.presentViewController(alertView, animated: true, completion: nil)
答案 3 :(得分:2)
您不能同时显示多个警报,如果您之前这样做,则表现不佳。重新考虑你的界面。
您可以轻松地连续显示警报,这是您真正需要的:
let alert = UIAlertController(title: "One", message: nil, preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Next", style: .Default, handler: {
_ in
let alert2 = UIAlertController(title: "Two", message: nil, preferredStyle: .Alert)
alert2.addAction(UIAlertAction(title: "OK", style: .Cancel, handler:nil))
self.presentViewController(alert2, animated: true, completion: nil)
}))
self.presentViewController(alert, animated: true, completion: nil)
答案 4 :(得分:1)
您需要将其呈现在最上面的控制器上,您可以使用此扩展名:
extension UIViewController {
var topController: UIViewController {
presentedViewController?.topController ?? self
}
}
self.topController.present(alert, animated: true)
答案 5 :(得分:0)
我认为我已经很晚了,但仍然发布,因为它可能对寻找此事的人有用,虽然Apple不建议多个警报堆叠,这就是为什么他们将此UIAlertView弃用到UIAlertController实现。
我为UIAlertAction创建了一个AQAlertAction子类。您可以将它用于交错警报,其用法与使用UIAlertAction相同。您需要做的就是在项目中导入AQMutiAlertFramework,或者也可以包含类(请参考Sample project)。在内部它使用二进制信号量来交错警报,直到用户处理与当前警报相关联的操作。让我知道它是否适合你。
答案 6 :(得分:0)
您可以使用JSAlertView来处理UIAlertView和UIAlertController API。
它可以同时处理多个同时触发的警报。它还提供了显示简单警报的超级简便方法。
答案 7 :(得分:0)
您可以使用此功能查找最顶层视图控制器。
val df = spark.read
.format("com.databricks.spark.xml")
.option("rowTag", "app")
.load("/home/sid/Downloads/Files/*.xml")
现在func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return topViewController(nav.visibleViewController)
}
if let tab = base as? UITabBarController {
if let selected = tab.selectedViewController {
return topViewController(selected)
}
}
if let presented = base?.presentedViewController {
return topViewController(presented)
}
return base
}
使用此方法。等,
UIAlertController
方法信息 topViewController()?.present(alertController, animated: true, completion: nil)
找到最顶层的视图控制器,
topViewController()
晚餐课程为UIAlertController
。
第一个UIViewController
在顶部呈现的视图控制器中处于正常状态,尝试打开第二个UIAlertController
,然后UIAlertController
给出第一个警报视图。所以没有任何topViewController()
错过。