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: {})
}
open を 2 回続けて呼び出すと (経過時間に関係なく)、最初の open では問題なく動作しますが、2 回目の open では機能しません。2 回目の開こうとすると、上記のエラーが発生します。
ただし、最近表示されたビューを閉じてから open を呼び出すと、(別のビューコントローラーで) open を再度呼び出すと問題なく動作します。
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
私が結論付けたのは、MOST-RECENT-CALL のみの rootViewController がビュー階層上にあるということです (それを却下したり、ビューを削除したりしていなくても)。すべてのローダー呼び出し (viewDidLoad、viewDidAppear、および遅延ディスパッチ呼び出しの実行) を試してみましたが、それを機能させる唯一の方法は、最上位のビュー コントローラーから present を呼び出すことだけであることがわかりました。