在导航堆栈中以模态方式呈现视图控制器

Posted

技术标签:

【中文标题】在导航堆栈中以模态方式呈现视图控制器【英文标题】:Presenting a view controller modally within a navigation stack 【发布时间】:2017-02-25 22:21:04 【问题描述】:

这是我的情况:

我在导航控制器中嵌入了两个视图控制器。我将它们称为发件人和目的地

基本上,我想要实现的是用导航堆栈中的目标“替换”发件人,以便按下发件人上的按钮转到目标,但按下导航栏中的“

问题是:我希望这两个视图控制器之间的转换是水平翻转,所以我创建了一个连接发送器和目标的 segue,类型为“Present Modally”,转换“水平翻转”,。 在发件人中,我选择“定义上下文”选项。

现在,对于连接转场:

-当我选择“Over Current Context”进行演示时,它完全符合我的要求! ...除了动画看起来有点不稳定。基本上,Sender 保持平坦和静止,而 Destination 在其上方翻转,而不是它们“一起”翻转。这是有道理的,因为 segue 正在 Sender 上呈现,但这并不是我想要的。

-当我选择“当前上下文”进行演示时,动画看起来很棒! ...除非我在导航栏中按下“

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview'

有人知道我如何才能实现我想要做的事情吗?这甚至是正确的方法吗? 我已经看到一些建议尝试将视图控制器的视图翻转到新视图,而不是将整个视图控制器翻转到不同的视图控制器。但是,故事板中的一个视图控制器是否可以有两个“全尺寸”视图?

谢谢!

【问题讨论】:

【参考方案1】:

我确信有多种方法可行,但我的第一个想法是为 Sender 和 Destination 视图创建一个容器视图。

所以你有...

带有根视图控制器(“RVC”)的导航控制器 容器视图控制器(“CVC”) 发件人 VC 目标 VC

而不是“RVC”转接“Sender”,而是转接“CVC”...“CVC”最初将“Sender”加载到其“容器视图”...此时,点击

当您点击一个按钮(或用于启动下一个转换的任何按钮)转到“目的地”时,您可以在容器视图中使用带有“将发件人替换为目的地”的转换 .. . 那时,由于“CVC”仍然是栈顶视图控制器,点击

希望这是有道理的:)

此处提供演示示例:https://github.com/DonMag/ContainerViewExample

【讨论】:

嗯,那么替换操作将如何工作?我还会使用类似的水平翻转转场吗?如果是这样,我会不会遇到与以前相同的问题,只是在这种情况下它会出现在 CVC 而不是 Sender VC 中? 不,你不会使用segue...看看:developer.apple.com/reference/uikit/uiview/1622574-transition 如果你还在做这个,我在github.com/DonMag/ContainerViewExample提供了一个演示应用程序 非常感谢!!它与我正在寻找的东西很接近,并帮助我得到了它!

以上是关于在导航堆栈中以模态方式呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图

以模态方式呈现视图控制器时,导航栏与黑色而不是白色混合

模式解除后返回导航控制器索引(无情节提要)

在 iOS 10 中以模态方式呈现新 VC 时崩溃

如何在保持导航栏存在的同时以模态方式呈现视图控制器。 (对于设置视图控制器)

嵌入到导航控制器中的动画根视图控制器以模态方式呈现