如何在模态呈现的视图控制器上执行呈现模态转场?

How can I perform a present modally segue on a view controller that is presented modally?

这听起来有点奇怪。

我有一个视图控制器,我们称它为 VC1,它以形式呈现 sheet。

当用户点击 VC1 中的按钮时,选择器会显示为一个操作 sheet。当用户选择特定项目并点击 "Done" 操作 sheet 时,我想以模态方式呈现另一个 VC (VC2)。

让我告诉你动作sheet:

所以我添加了一个连接 VC1UINavigationController 的 "Present Modally" segue。这个 UINavigationControllerVC2 作为它的根视图控制器。 segue 有一个 "Form Sheet" 的演示文稿和一个 "Flip Horizontal" 的演示文稿。

当我测试我的应用程序时,此警告出现在控制台中并且根本没有显示任何视图控制器:

Warning: Attempt to present on which is already presenting (null)

我当时想 "What the heck is it talking about? How can VC1 be presenting null?" 奇怪的是它使用 null(这是 C# 和 Java 的术语)而不是 nil(Swift 使用)。

我尝试了不同的过渡和演示。但是出现相同的消息。我还尝试删除 UINavigationController 并直接呈现 VC2。这次,错误消息变为:

Warning: Attempt to present on which is already presenting (null)

如何以模态方式呈现 VC2

经过一些尝试,我发现像这样调用 dispatch_after 并执行 segue 可以解决问题。不过我不知道为什么。

dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue()) {
    self.performSegueWithIdentifier("someIdentifier", sender: self)
}

也许这是由于某种动作 sheet 魔法。