TL; DR Solo puede tener 1 rootViewController y es el presentado más recientemente. Por lo tanto, no intente que un viewcontroller presente otro viewcontroller cuando ya se haya presentado uno que no se ha descartado.
Después de hacer algunas de mis propias pruebas, he llegado a una conclusión.
Si tiene un rootViewController que desea presentar todo, entonces puede encontrarse con este problema.
Aquí está mi código rootController (abrir es mi acceso directo para presentar un viewcontroller desde la raíz).
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: {})
}
Si llamo a abrir dos veces seguidas (independientemente del tiempo transcurrido), esto funcionará bien en la primera apertura, pero NO en la segunda apertura. El segundo intento de apertura dará como resultado el error anterior.
Sin embargo, si cierro la vista presentada más recientemente y llamo a abrir, funciona bien cuando llamo a abrir nuevamente (en otro controlador de vista).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Lo que he concluido es que el rootViewController de solo MOST-RECENT-CALL está en la vista Jerarquía (incluso si no lo descartó o eliminó una vista). Traté de jugar con todas las llamadas del cargador (viewDidLoad, viewDidAppear y haciendo llamadas de despacho retrasado) y descubrí que la única forma en que puedo hacer que funcione es SOLO llamando al presente desde el controlador de la vista superior.
presentViewController:animated:completion
a un controlador de navegación. ¿Estás haciendo esto en el delegado de la aplicación?