TL; DR Możesz mieć tylko 1 rootViewController i jego najnowszą prezentację. Nie próbuj więc wyświetlać innego kontrolera widoku, gdy jest już przedstawiony kontroler, który nie został zwolniony.
Po przeprowadzeniu kilku własnych testów doszedłem do wniosku.
Jeśli masz rootViewController, który chcesz zaprezentować wszystko, możesz napotkać ten problem.
Oto mój kod rootController (otwarty jest mój skrót do prezentacji kontrolera widoku z katalogu głównego).
func open(controller:UIViewController)
{
if (Context.ROOTWINDOW.rootViewController == nil)
{
Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
Context.ROOTWINDOW.makeKeyAndVisible()
}
ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})
}
Jeśli wywołam open dwa razy z rzędu (niezależnie od upływu czasu), zadziała to dobrze przy pierwszym otwarciu, ale NIE przy drugim otwarciu. Druga otwarta próba spowoduje błąd powyżej.
Jeśli jednak zamknę ostatnio prezentowany widok, a następnie zadzwonię, otwórz, to zadziała dobrze, gdy ponownie wywołam open (na innym kontrolerze widoku).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Doszedłem do wniosku, że rootViewController tylko MOST-RECENT-CALL jest w widoku Hierarchia (nawet jeśli go nie odrzuciłeś ani nie usunąłeś). Próbowałem grać ze wszystkimi wywołaniami modułu ładującego (viewDidLoad, viewDidAppear i wykonywanie opóźnionych wywołań wysyłki) i odkryłem, że jedynym sposobem, w jaki mogę go uruchomić, jest WYŁĄCZNIE wywołanie obecne z najwyżej kontrolera widoku.
presentViewController:animated:completion
się z kontrolerem nawigacyjnym. Czy robisz to w delegacie aplikacji?