TL;DR Sie können nur 1 RootViewController haben, und das ist der zuletzt präsentierte. Versuchen Sie also nicht, dass ein Viewcontroller einen anderen Viewcontroller präsentiert, wenn er bereits einen präsentiert hat, der noch nicht verworfen wurde.
Nachdem ich einige meiner eigenen Tests durchgeführt habe, bin ich zu einem Schluss gekommen.
Wenn Sie einen RootViewController haben, der alles darstellen soll, können Sie auf dieses Problem stoßen.
Hier ist mein rootController-Code (open ist meine Abkürzung für die Darstellung eines Viewcontrollers aus dem Root).
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: {})
}
Wenn ich zweimal hintereinander "open" aufrufe (unabhängig von der verstrichenen Zeit), funktioniert das beim ersten Öffnen einwandfrei, beim zweiten Öffnen jedoch NICHT mehr. Der zweite Öffnungsversuch führt zu dem oben genannten Fehler.
Wenn ich jedoch die zuletzt dargestellte Ansicht schließe und dann open aufrufe, funktioniert es einwandfrei, wenn ich open erneut aufrufe (auf einem anderen Viewcontroller).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Ich bin zu dem Schluss gekommen, dass der RootViewController nur für den MOST-RECENT-CALL in der View-Hierarchie steht (auch wenn Sie ihn nicht entlassen oder einen View entfernt haben). Ich habe versucht, spielen mit allen Loader-Aufrufe (viewDidLoad, viewDidAppear, und tun verzögerte Dispatch-Aufrufe) und ich habe festgestellt, dass der einzige Weg, den ich bekommen konnte, es zu arbeiten ist NUR Aufruf vorhanden aus der obersten Ansicht-Controller.