Отображение нескольких UIAlerts с использованием UIAlertController [дубликат]

4
задан Glorfindel 14 July 2015 в 15:20
поделиться

7 ответов

Вы можете найти Top Most View Controller, используя эту функцию.

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.

first UIAlertController открыто нормально в верхнем представленном контроллере представления, попробуйте открыть второй UIAlertController, затем topViewController(), учитывая первое предупреждение. поэтому никакие UIAlertController не пропустили.

0
ответ дан AshvinGudaliya 25 August 2018 в 01:01
поделиться

Ниже приведен метод, показывающий несколько предупреждений:

        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];
8
ответ дан Bejibun 25 August 2018 в 01:01
поделиться

Быстрая версия для ответа @ Bejibun выше:

    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)
2
ответ дан Brendan Lynch 25 August 2018 в 01:01
поделиться

Вы можете отслеживать список предупреждений, отображаемых в контроллере представления в качестве переменной экземпляра, например

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];
}

Обратите внимание, что это может очень раздражать пользователя, если ему нужно щелкнуть по большому количеству сообщений. Вы можете рассмотреть возможность объединения их в одно сообщение.

3
ответ дан Glorfindel 25 August 2018 в 01:01
поделиться

Вы можете использовать JSAlertView , который обрабатывает как API UIAlertView, так и UIAlertController API.

Он обрабатывает несколько предупреждений, выпущенных в одно и то же время, очень хорошо. Он также предоставляет супер простые методы для отображения простых предупреждений.

0
ответ дан Jitendra Singh 25 August 2018 в 01:01
поделиться

Я думаю, что я очень опаздываю на это, но все равно публикую, поскольку это может быть полезно для кого-то, кто ищет это, хотя Apple не рекомендует многократные оповещения, поэтому они отказались от этого UIAlertView от реализации UIAlertController.

Я создал подкласс AQAlertAction для UIAlertAction. Вы можете использовать его для ошеломляющих предупреждений, использование такое же, как вы используете UIAlertAction. Все, что вам нужно сделать, это импортировать AQMutiAlertFramework в ваш проект, или вы можете также включить класс (см. Пример проекта ). Внутренне Он использует двоичный семафор для ошеломления Оповещений, пока пользователь не обработает действие, связанное с отображаемым текущим предупреждением. Дайте мне знать, если это сработает для вас.

0
ответ дан Kraming 25 August 2018 в 01:01
поделиться

Вы не можете одновременно отображать несколько предупреждений, и если вы делали это раньше, вы плохо себя чувствовали. Переосмыслите свой интерфейс.

Вы можете легко представить предупреждения подряд , что вам действительно нужно:

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)
2
ответ дан matt 25 August 2018 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: