Storyboards中Modal和Push segue有什么区别?

181

请问有人能够解释一下 modalpush 转场的确切区别吗?

我知道当我们使用 push 时,转场会被添加到一个栈中,所以当我们不断地使用 push 时,它会一直占用内存?

请问有人可以向我展示一下这两种转场是如何实现的吗?

Modal 转场可以通过简单地 ctrl-click 并拖动到目标来创建,但是当我尝试使用 push 时,我的应用程序会崩溃。

我正在从一个按钮推送到一个具有 UIViewControllerUINavigationController 中。

4个回答

178

一个push Segue是将另一个VC添加到导航栈中。这假设发起推送的VC是与被添加到栈中的VC属于同一导航控制器。在导航控制器和深度堆栈中,内存管理不是问题。只要您注意从一个VC传递给另一个VC的对象,运行时会处理导航栈。请参见以下图像进行视觉指示: NavStack

一个modal Segue仅仅是一个VC以模态方式呈现另一个VC。这些VC不必是导航控制器的一部分,并且通常认为是呈现(父)VC的“子”VC。模态呈现的VC通常没有任何导航栏或选项卡栏。呈现的VC还负责取消创建和呈现的模态VC。


2
@EIJay,感谢您的详细解释。我还有一个问题,什么时候应该使用模态(modal)和何时使用推送(push)segue? - Gaurav_soni
44
通常,当您想显示摘要视图的详细视图时,请使用导航控制器和Push Segues。如果“父”视图在数据上与“子”视图没有实际关联,则使用模态。模态视图的一个很好的例子是登录视图。就数据而言,登录视图与“父”视图没有任何关系。 - LJ Wilson
6
是的,你可以创建“模型链”。 如果将下游VC取消,则会将所有上游VC一起取消(仅在启用动画时用户才能看到顶部VC取消)。 这就像导航控制器。 - Constantino Tsarouhas
4
是的。只要你的segue是模态的,在Storyboard中,你会发现导航栏没有继承。所以只需点击你的模态链中第一个视图控制器,然后点击菜单编辑 -> 嵌入 -> 导航控制器。这将为你设置一个导航控制器,它将是所有模态链共用的。请注意,此时仅显示导航控制器的segue为“模态”,而您模态链中的所有segue都必须是“push”segue。 - HpTerm
4
只有在你的起始 VC 使用了导航控制器时,才能使用 Push 进行跳转。如果尝试从不嵌入导航控制器的 VC 进行 Push,将会出现异常。因此,这与父子间数据连接的紧密程度无关,只与是否使用导航控制器管理 VC 相关。使用模态过渡,你也可以手动执行相同的操作。 - SmileBot
显示剩余6条评论

24

Swift 3.0 和 XCode 8.2.1 更新

1. 推送 Segue

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

在此输入图片描述

推送 Segue 还提供了默认功能。子视图控制器将有一个返回按钮,可以返回到父视图控制器。你还可以向右滑动以弹出子视图控制器。推送 Segue 的动画效果类似于水平滑动页面。

在此输入图片描述

尽管允许从没有嵌入导航控制器的视图控制器创建推送 Segue,但是这样做会失去所有的功能,如导航栏、动画、手势等。在这种情况下,你应该先将父视图控制器嵌入到导航视图控制器中,然后再将推送 Segue 连接到子视图控制器。

在此输入图片描述

2. 模态 Segue

另一方面,模态转场(即以模态方式呈现)会在当前视图控制器上方进行呈现。子视图控制器不会继承导航视图控制器,因此,如果您从带有导航视图控制器的视图控制器中进行模态转场,则将失去导航栏。如果您想要重新获得导航栏,则必须再次将子视图控制器嵌入导航控制器中并启动全新的导航堆栈。如果想要返回到父视图控制器,则需要自己实现并从代码中调用 dismiss

输入图像描述

对于模态转场的动画效果,子视图控制器将从页面底部出现。在此演示中,导航视图控制器也消失了。

输入图像描述


7

推送视图必须建立在一个navigationController中。

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

EDITOR->embed in->navigationController

错误,pushView 也可以在没有 navigationController 的情况下构建,这个答案是不完整的! - Daksh Gargas

1
使用自定义推送和转场方法来控制Storyboard。Modal是一种在不使用Storyboard的情况下导航视图的方式。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接