TL; DR Vous ne pouvez avoir qu'un seul rootViewController et son dernier présenté. N'essayez donc pas de faire en sorte qu'un viewcontroller présente un autre viewcontroller alors qu'il est déjà présenté, qui n'a pas été rejeté.
Après avoir fait mes propres tests, je suis arrivé à une conclusion.
Si vous avez un rootViewController que vous souhaitez tout présenter, vous pouvez rencontrer ce problème.
Voici mon code rootController (ouvert est mon raccourci pour présenter un viewcontroller depuis la racine).
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 j'appelle ouvert deux fois de suite (quel que soit le temps écoulé), cela fonctionnera très bien lors de la première ouverture, mais PAS lors de la deuxième ouverture. La deuxième tentative d'ouverture entraînera l'erreur ci-dessus.
Cependant, si je ferme la dernière vue présentée et que j'appelle open, cela fonctionne très bien lorsque j'appelle à nouveau open (sur un autre viewcontroller).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Ce que j'ai conclu, c'est que le rootViewController de seulement le MOST-RECENT-CALL est sur la hiérarchie des vues (même si vous ne l'avez pas supprimé ou supprimé une vue). J'ai essayé de jouer avec tous les appels du chargeur (viewDidLoad, viewDidAppear et faire des appels de répartition retardés) et j'ai trouvé que la seule façon de le faire fonctionner est d'appeler SEULEMENT le plus haut contrôleur de vue.
presentViewController:animated:completion
un contrôleur de navigation. Faites-vous cela dans le délégué de l'application?