TL; DR rootViewControllerは1つと、最後に表示されたもののみが可能です。そのため、却下されていないビューコントローラーが既に表示されている場合は、ビューコントローラーに別のビューコントローラーを表示させないでください。
私自身のテストのいくつかを行った後、私は結論に達しました。
すべてを表示したいrootViewControllerがある場合、この問題が発生する可能性があります。
これが私のrootControllerコードです(openはルートからビューコントローラーを表示するための私のショートカットです)。
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: {})
}
(経過時間に関係なく)2回続けてopenを呼び出すと、最初のオープンでは問題なく機能しますが、2番目のオープンでは機能しません。2回目の開こうとすると、上記のエラーが発生します。
ただし、最後に表示されたビューを閉じてからopenを呼び出すと、(別のビューコントローラーで)openを再度呼び出すと問題なく機能します。
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
私が結論付けたのは、MOST-RECENT-CALLのみのrootViewControllerがビュー階層にあるということです(たとえそれを閉じたり、ビューを削除しなかったとしても)。すべてのローダー呼び出し(viewDidLoad、viewDidAppear、および遅延ディスパッチ呼び出し)を試してみましたが、これを機能させる唯一の方法は、最上部のビューコントローラーから存在するものを呼び出すことだけであることがわかりました。
presentViewController:animated:completion
ナビコントローラーを呼び出そうとする以外は、まったく同じ問題が発生しています。アプリのデリゲートでこれを行っていますか?