TL; DR Вы можете иметь только 1 rootViewController и его последний представленный. Так что не пытайтесь, чтобы viewcontroller представлял другой viewcontroller, когда он уже представлен тот, который не был отклонен.
После некоторого собственного тестирования я пришел к выводу.
Если у вас есть rootViewController, который вы хотите представить все, вы можете столкнуться с этой проблемой.
Вот мой код rootController (open - мой ярлык для представления viewcontroller из корня).
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: {})
}
Если я вызываю open два раза подряд (независимо от прошедшего времени), это будет прекрасно работать при первом открытии, но НЕ при втором открытии. Вторая попытка открытия приведет к ошибке выше.
Однако, если я закрываю последний представленный вид, затем вызываю open, он прекрасно работает, когда я снова вызываю open (на другом viewcontroller).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Я пришел к выводу, что rootViewController только MOST-RECENT-CALL находится в иерархии представления (даже если вы не отклонили его или не удалили представление). Я попытался поиграть со всеми вызовами загрузчика (viewDidLoad, viewDidAppear и выполнить отложенные вызовы диспетчеризации) и обнаружил, что единственный способ заставить его работать - это ТОЛЬКО вызов подарка с самого верхнего контроллера представления.
presentViewController:animated:completion
навигационный контроллер. Вы делаете это в приложении делегата?