Работаю с UIKit
уже много лет.Удивительно, как подобные проблемы появляются неожиданно.
У меня есть простая настройка навигации:
UINavigationController
HomeViewController
[push] DetailViewController
[push] ModalViewController
[модальный]
Корневой навигационный контроллер с двумя нажатыми дочерними элементамив стек.Затем модал, представленный из корневого контроллера навигации.
По какой-то причине следующий фрагмент кода не работает должным образом:
extension UINavigationController {
func popToViewController(_ vc: UIViewController, animated: Bool, completion: @escaping ([UIViewController]?)->()) {
let popped = popToViewController(viewController, animated: animated)
if let coordinator = self.transitionCoordinator {
coordinator.animate(alongsideTransition: nil) { _ in
completion(popped)
}
}
else {
completion(popped)
}
}
}
с использованием расширения:
navigationController.popToViewController(
homeViewController,
animated: true
)
Нет ошибок, предупреждений или сбоев.Пользовательский интерфейс все еще полностью отзывчив. Но DetailViewController
в стеке никогда не появляется.Проверка переменной popped
расширения приводит к появлению пустого массива, что имеет смысл, поскольку DetailViewController
явно не удаляется из стека.
Что может помешать навигационному контроллеру вытолкнуть с него действительный vcстек?
Вещи, которые я проверял:
homeViewController
уже в стеке , и я спрашиваю эточтобы заглянуть в тот же экземпляр.т.е. navigationController.viewControllers.contains(homeViewController) == true
- Я в главной теме.т. е.
Thread.isMainThread == true
navigationController.viewControllers
возвращает один и тот же массив до и после вызова popToViewController(_vc:animated:)
- Вручную выяснить, какие vc-файлы нужно получить, и вызвать
setViewControllers(_ vcs:animated:)
с помощью vcs, который я хочусохранить (в данном случае только экземпляр HomeViewController
).Это все еще имеет ту же проблему.
Я хочу сказать, что это как-то связано с выталкиванием контроллеров представления из стека из-за модальной презентации.Но, насколько я знаю, это нормально.Кроме того, я делал это раньше, и у меня не было проблем в прошлом.