2015-02-19 2 views
4

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

func applicationDidBecomeActive(application: UIApplication) 

С UIAlertView s игнорировал иерархии вида в большинстве случаев, это решение работало независимо от того, где пользователь находился в приложении.

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

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

+0

Почему бы вы представить его из приложения делегата в первую очередь? – vikingosegundo

+0

Не удалось создать настраиваемый метод класса UIAlertController для 'show' с параметром, который передает UIViewController? Затем вызовите этот метод с любого контроллера представления и передайте 'self'. – brandonscript

+0

@vikingosegundo Для этого конкретного случая использования мы проверяем обновление каждый раз, когда приложение открывается. Мы не показываем, что демонстрирует «UIViewController», не пересекая иерархию представлений, поэтому просто использование «UIAlertView show» отлично работало. –

ответ

0

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

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

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

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

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

  1. сделать ваше окно ключа и видимое окно (window.makeKeyAndVisible())
  2. Просто использовать простой UIViewController экземпляра в качестве RootViewController нового окна. (window.rootViewController = UIViewController())
  3. Предъявите UIAlertController на RootViewController вашего окна

пару вещей отметить:

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

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

https://github.com/dbettermann/DBAlertController

-1

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

0

Try This

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]; 
Смежные вопросы