Хотя существует существующий переход или презентация; стек навигации не будет обновлен

Я столкнулся с этим предупреждением:

pushViewController: анимированный: вызывается, пока существующий переход или презентация происходит; стек навигации не будет обновлен.

При попытке вызвать блок navigationController?.popViewControllerAnimated(false) из UIAlertController завершения.

Ответ 1

Это предупреждение указывает, что вы неправильно используете UINavigationController:

pushViewController: анимированный: вызывается, когда происходит существующий переход или презентация; стек навигации не будет обновлен

Вы упомянули в комментариях, что вы пытаетесь pop ViewController используя

navigationController?.popViewControllerAnimated(false)

внутри блока завершения UIAlertController. Поэтому вы пытаетесь расслабиться от неправильного представления, UIAlertController не входит в стек UINavigationController.

Сначала попробуйте сначала закрыть UIAlertController, а затем поместите текущий ViewController. Другими словами, удалите pop из блока completion и поместите его в блок OK. или используйте unwind segue перед предупреждением.

Другая возможность заключается в том, что у вас есть неиспользуемый или идентичный дубликат в storyboard. Следовательно, если операция unwinding запускается кнопкой storyboard, выберите эту кнопку и проверьте connectivity inspector и удалите ненужные соединения.

Например: отмеченный красный x не нужен в моем случае. Пример

Ответ 2

Я решил это с помощью DispatchQueue.main.asyncAfter вызова popviewcontroller после завершения UIAlertController Transition

1) Показать оповещение

2) Вызов поп-наблюдателя после задержки

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    self.navigationController?.popToRootViewController(animated: true)
}

Это не лучший способ, но он работает!

Ответ 3

Я использую dispatch_async и его рабочий. я попытался вернуться назад, но не работал , потому что стек навигации не обновляется.

let destVC = self.storyboard?.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
    self.presentViewController(destVC, animated: true, completion: {() -> Void in
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
            self.navigationController?.popViewControllerAnimated(true)!
        })
    })

Ответ 4

Добавьте код контроллера навигации в обработчик кнопки ok. Когда нажмите на кнопку ok, перейдите к контроллеру вида

let okActionBtn = UIAlertAction(title: "Ok", style: .default, handler: {
      self.navigationController?.popViewController(animated: true)
})
let cancelActionBtn = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addAction(okActionBtn)
alert.addAction(cancelActionBtn)
self.present(alert, animated: true)

Ответ 5

Мое решение заключалось бы в вызове функции shutViewControllerAnimated: сначала, а затем вывести диспетчер представлений из стека навигации, это работает для меня: -

[self dismissViewControllerAnimated:false completion:nil];
[myNavigationControllerInstance popToRootViewControllerAnimated:true]; // myNavigationControllerInstance = Your Navigation Controller Instance