iOS中的多个UIAlertControllers

时间:2015-07-14 15:07:16

标签: ios objective-c

在我的应用中,有些情况可能会出现多个警报。但是在iOS8 UIAlertview转向UIAlertController时,我无法显示多个警报,因为您无法同时显示两个或更多控制器。

如何使用UIAlertController实现此目的?

8 个答案:

答案 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()错过。