如何在模态呈现的视图控制器上执行呈现模态序列?
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”连接VC1
和UINavigationController
。这个UINavigationController
有VC2
作为它的根视图控制器。 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