TL; DR Você pode ter apenas 1 rootViewController e é o mais recente apresentado. Portanto, não tente que um viewcontroller apresente outro viewcontroller quando ele já tiver apresentado um que não tenha sido descartado.
Depois de fazer alguns dos meus próprios testes, cheguei a uma conclusão.
Se você tiver um rootViewController que deseja apresentar tudo, poderá encontrar esse problema.
Aqui está o meu código rootController (aberto é o meu atalho para apresentar um viewcontroller a partir da raiz).
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: {})
}
Se eu abrir aberto duas vezes seguidas (independentemente do tempo decorrido), isso funcionará bem na primeira abertura, mas NÃO na segunda abertura. A segunda tentativa aberta resultará no erro acima.
No entanto, se eu fechar a visualização apresentada mais recentemente e depois abrir, ela funcionará bem quando eu abrir novamente (em outro controlador de exibição).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
O que concluí é que o rootViewController apenas da MOST-RECENT-CALL está na Hierarquia da exibição (mesmo que você não a tenha descartado ou removido uma exibição). Tentei jogar com todas as chamadas do carregador (viewDidLoad, viewDidAppear e fazer chamadas de despacho atrasadas) e descobri que a única maneira de fazê-lo funcionar é SOMENTE chamando presente do controlador de exibição mais superior.
presentViewController:animated:completion
um controlador nav. Você está fazendo isso no delegado do aplicativo?