Storyboard 中的 Modal 和 Push segue 有啥区别?

Posted

技术标签:

【中文标题】Storyboard 中的 Modal 和 Push segue 有啥区别?【英文标题】:What is the difference between Modal and Push segue in Storyboards?Storyboard 中的 Modal 和 Push segue 有什么区别? 【发布时间】:2012-03-12 15:50:02 【问题描述】:

有人能解释一下modalpush segue 之间的确切区别吗?

我知道当我们使用push 时,segue 会被添加到堆栈中,所以当我们继续使用push 时,它会一直占用内存?

有人可以告诉我这两个是如何实现的吗?

Modal segues 可以通过简单地创建 ctrl-click 并拖动到目的地但是当我使用push 这样做时,我的应用程序崩溃了。

我正在从一个按钮推动一个具有UIViewControllerUINavigationController

【问题讨论】:

【参考方案1】:

push Segue 正在向导航堆栈添加另一个 VC。这假定发起推送的 VC 是添加到堆栈的 VC 所属的同一导航控制器的一部分。内存管理不是导航控制器和深度堆栈的问题。只要您处理可能从一个 VC 传递到另一个 VC 的对象,运行时就会处理导航堆栈。请参阅图像以获取视觉指示:

modal Segue 只是一个 VC 以模态方式呈现另一个 VC。 VC 不必是导航控制器的一部分,并且以模态方式呈现的 VC 通常被认为是呈现(父)VC 的“子”。模态呈现的 VC 通常没有任何导航栏或标签栏。呈现的 VC 还负责解散它创建和呈现的模态 VC。

希望这会有所帮助。

【讨论】:

@EIJay 感谢您的精彩解释。还有一个问题,我什么时候必须使用模态以及什么时候使用 push segue? 一般来说,当你想显示摘要视图的详细视图时,使用导航控制器和 Push Segues。如果就数据而言,“父”视图与“子”视图并不真正相关,则使用模式。模式视图的一个很好的例子是登录视图。就数据而言,登录视图与“父”视图没有任何关系。 @T.J.是的,您可以创建“模型链”。关闭链下的 VC 会关闭链上的所有 VC - 用户只会看到顶部的 VC 关闭(当您启用动画时)。这就像导航控制器。 @jchatard 是的。只要您的 segue 是模态的,在故事板中您就会看到导航栏没有被继承。因此,只需单击您拥有的模态链的第一个 VC,然后单击菜单编辑器 -> 嵌入 -> 导航控制器。这将为您设置一个导航控制器,该控制器对您的所有模态链都是通用的。并不是说此时只有用于显示导航控制器的 segue 是“模态”的,而模态链中的所有 segue 都必须是“push” segue。 只有当您正在使用的 VC 使用导航控制器时,才能使用推送。尝试从未嵌入导航控制器的 VC 推送,它会抛出异常。因此,这实际上与父子之间的数据连接的紧密程度无关,它仅与您是否使用导航控制器来管理您的 VC 有关。您可以使用模态转换使用 segues 手动执行完全相同的操作。【参考方案2】:

Swift 3.0 和 XCode 8.2.1 更新

1.推送转场

Push segue 已重命名为 Show segue。要创建 push segue,父视图控制器需要嵌入到导航控制器中。导航控制器提供导航栏。一旦你用 push segue 连接了两个视图控制器,子视图控制器将自动在顶部有导航栏。子视图控制器将被添加到导航堆栈的顶部。

Push segue 还提供默认功能。子视图控制器将有一个返回按钮,可让您返回父视图控制器。您还可以向右滑动以弹出子视图控制器。 push segue 的动画就像水平滑动页面。

虽然您可以从不在导航控制器中的视图控制器进行推送转场,但这样做时您将失去导航栏、动画、手势等所有功能。在这种情况下,您应该先将父视图控制器嵌入到导航视图控制器中,然后再对子视图控制器进行推送。

2。模态转场

另一方面,模态序列(即模态呈现)正在当前视图控制器上呈现。子视图控制器不会继承导航视图控制器,因此如果您从带有导航视图控制器的视图控制器中呈现模态序列,导航栏将会丢失。您必须再次将子视图控制器嵌入导航控制器并启动一个全新的导航堆栈,如果您想要它回来。如果你想回到父视图控制器,你必须自己实现它并从代码中调用dismiss

模态segue的动画是子视图控制器将从页面底部出现。导航视图控制器在这个演示中也没有了

【讨论】:

【参考方案3】:

推送视图必须构建在 navigationController 中。

点击你的master view,然后在菜单栏中选择:

EDITOR->embed in->navigationController

【讨论】:

错了,pushView 也可以在没有navigationController 的情况下构建,这个答案不完整!【参考方案4】:

这是使用故事板的自定义推送和segue方法推送控件

Modal 是在不使用 Storyboard 的情况下浏览视图的方式。

【讨论】:

如何在不使用情节提要的情况下创建模态转场? @jianpx :只有在使用情节提要时才能进行转场。否则,您可以使用 Navigation 控制器或 PresentModalViewController 在视图之间切换。 @Pushkraj 谢谢。所以你的意思是没有办法通过代码创建segue? @jianpx :不需要。仅在使用情节提要时才需要 Segue。

以上是关于Storyboard 中的 Modal 和 Push segue 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Storyboard Modal ViewController 不会关闭;已经尝试了一切

iOS_16_控制器切换_modal_storyboard拖线的方式

iOS Storyboard Presenting Segues "relationship, embed, push, modal, custom" 类型

IOS-Storyboard控制器切换之Push

IOS的模态窗口(modal)

使用 Storyboard 在视图之间转换