Поведение UIAlertView show() для UIAlertController

В предыдущих версиях iOS я смог вызвать show в UIAlertView в App Delegate. Более конкретно, show вызывается в:

func applicationDidBecomeActive(application: UIApplication)

Так как UIAlertView в большинстве случаев не учитывал иерархию представлений, это решение работало независимо от того, где пользователь находился в приложении.

С введением UIAlertController эта проблема становится немного сложнее. UIAlertController теперь является подклассом UIViewController и должен быть представлен точно так же, как любой другой UIViewController. Представляя UIAlertController из keyWindow, rootViewController работает, это не идеальное решение.

Есть ли у кого-нибудь идеи по репликации функциональности [UIAlertView show] для UIAlertController? Любой способ показать UIAlertController в приложении активным без прохождения иерархии представлений?

Ответ 1

Я понял, какое решение я считаю более элегантным, чем ответ, который я опубликовал ранее. Я скопирую и вставлю ответ, который я отправил в аналогичный вопрос. Следуйте ссылке внизу моего сообщения, если вы просто хотите увидеть код.

Решение заключается в использовании дополнительного интерфейса UIWindow.

Если вы хотите отобразить свой UIAlertController:

  • Сделайте свое окно ключевым и видимым окном (window.makeKeyAndVisible())
  • Просто используйте простой экземпляр UIViewController в качестве rootViewController нового окна. (window.rootViewController = UIViewController())
  • Представьте свой UIAlertController на вашем окне rootViewController

Несколько замечаний:

  • Ваш UIWindow должен быть строго привязан. Если он не будет сильно ссылаться, он никогда не появится (потому что он выпущен). Я рекомендую использовать свойство, но у меня также был успех с связанным объектом.
  • Чтобы окно выглядело над всем остальным (включая системные UIAlertControllers), я устанавливаю windowLevel. (window.windowLevel = UIWindowLevelAlert + 1)

Наконец, у меня есть завершенная реализация, если вы просто хотите посмотреть на это.

https://github.com/dbettermann/DBAlertController

Ответ 2

Вот что я закончил с:

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)
    }
}

Ответ 3

Попробуйте это

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

Ответ 4

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