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

Posted

技术标签:

【中文标题】如何在模态呈现的视图控制器上执行呈现模态序列?【英文标题】:How can I perform a present modally segue on a view controller that is presented modally? 【发布时间】:2016-06-30 11:07:39 【问题描述】:

这听起来有点奇怪。

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

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

让我给你看一下操作表:

所以我添加了一个“Present Modally”连接VC1UINavigationController。这个UINavigationControllerVC2 作为它的根视图控制器。 segue 有一个“表格”的演示文稿和一个“水平翻转”的演示文稿。

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

警告:尝试在其上呈现(空)

我当时想“这到底是在说什么?VC1 怎么会呈现空值?”奇怪的是它使用 null(这是 C# 和 Java 的术语)而不是 nil(Swift 使用的)。

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

警告:尝试在其上呈现(空)

我如何以模态方式呈现VC2

【问题讨论】:

您不能以模态方式在另一个以模态方式呈现自身的 vc 上呈现 vc。您可以做什么:关闭 VC1,然后在同一主机 vc 上呈现 VC2 @Elena 但是经过一番尝试,我发现我可以打电话给dispatch_after 来解决这个问题。我会发布一个答案。 @Elena 你能解释一下吗? 你说得对,我之前说的不是真的。正确的答案是您不能同时向同一主机上的模态 VC 展示。 【参考方案1】:

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

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

也许这是由于某种动作表魔术。

【讨论】:

在这种情况下self 是什么?

以上是关于如何在模态呈现的视图控制器上执行呈现模态序列?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查视图控制器是不是以模态方式呈现或推送到导航堆栈上?

XCTest 如何执行 segue 呈现模态视图并测试presentedViewController

如何自定义模态视图控制器呈现动画?

如何从 appdelegate 呈现和关闭模态视图?

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

如何模态呈现一个视图来选择 UIImagePicker sourceType?