TL;DR您只能拥有 1 个 rootViewController 及其最近呈现的一个。因此,当一个视图控制器已经呈现一个尚未被解除的视图控制器时,不要尝试让它呈现另一个视图控制器。
在做了一些我自己的测试后,我得出了一个结论。
如果您有一个想要呈现所有内容的 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 (不管经过了多少时间),这将在第一次打开时工作得很好,但在第二次打开时就不行了。第二次打开尝试将导致上述错误。
但是,如果我关闭最近呈现的视图然后调用 open,当我再次调用 open(在另一个视图控制器上)时它工作得很好。
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
我得出的结论是,只有 MOST-RECENT-CALL 的 rootViewController 位于视图层次结构中(即使您没有关闭它或删除视图)。我尝试使用所有加载程序调用(viewDidLoad、viewDidAppear 和延迟调度调用),我发现我可以让它工作的唯一方法是只从最顶层的视图控制器调用 present。