Хотя существует существующий переход или презентация; стек навигации не будет обновлен
Я столкнулся с этим предупреждением:
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