2016-11-17 2 views
4

Swift 3, Xcode 8.1. Я хочу показать UIAlertController в UIViewController.iOS. Попытка представить UIAlertController на UIViewController, чей вид отсутствует в иерархии окон

У меня есть методы:

private static func rootViewController() -> UIViewController { 
    // cheating, I know 

    return UIApplication.shared.keyWindow!.rootViewController! 
} 

static func presentAlert(_ message: String) { 
    let alertView = UIAlertController(title: "RxExample", message: message, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .cancel) { _ in }) 

    rootViewController().present(alertView, animated: true, completion: nil) 
} 

Full code of this class you can find here

я называю метод presentAlert в viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 
    DefaultWireframe.presentAlert("test") 
    ... 
} 

и получил предупреждение:

Внимание: В соблазн представить UIAlertController: 0x7f904ac0d930 на UIViewController: 0x7f904ad08040, чей вид не находится в иерархии окон!

Как избежать предупреждения и отображения предупреждения?

Он работает, когда я пытаюсь показать оповещение в исходном ViewController, но он не работает в другом ViewController, подключенном с помощью push segue с начальным VC.

+0

Вы уверены, что 'rootViewController', на котором вы пытаетесь представить' UIAlertController', видимо и не покрывается другим модульным контроллером представления, например? – dive

+0

Нажмите кнопку просмотра отладки (ее в панели над консолью отладки) на этом viewController. С левой стороны вы увидите весь стек представления с окном наверху. Вы можете щелкнуть правой кнопкой мыши по любому виду, чтобы распечатать описание. Сравните это с представлением rootViewController(); это должно быть так, чтобы показать, как ваше представление rootViewController больше не находится в иерархии. Выберите вид, который используется и использует его. –

+0

Любое решение найдено? Столкнувшись с той же проблемой. –

ответ

16

В viewDidLoad ваше приложение пока не представило пользователю контроллер просмотра, поэтому предупреждение не может быть показано. Попробуйте выполнить этот код в viewDidAppear

+0

Тот же результат, если я вызову этот метод в IBAction кнопки –

+1

@karnett Отличный ответ. благодаря –

3

У меня была аналогичная проблема/случай, когда лист действий не показывался на ViewController, который был нажат на другой ViewController. Ошибка, которую она давала, также была похожа на вашу. То, что вы сделали, отлично работает на обычных ViewControllers, но просто не работает на ViewControllers, которые перетаскиваются через другой ViewController.

Я решил проблему, сделав объект класса UIAlertController в качестве переменной экземпляра моего класса, а не сохраняя его локально внутри функции запуска.

Так что в вашем случае попробуйте объявить var alertView: UIAlertController? в верхней части класса, где объявлены переменные экземпляра, а затем просто инициализирует его в нужную функцию запуска, чтобы использовать его как это:

static func presentAlert(_ message: String) { 
    self.alertView = UIAlertController(title: "RxExample", message: message, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .cancel) { _ in }) 

    rootViewController().present(alertView, animated: true, completion: nil) 
} 

Может быть какая-то ошибка с Со стороны Apple в поддержании ссылки, которая вызывала эту проблему. Но работа, о которой я писал выше, работает отлично.

Смежные вопросы

 Смежные вопросы