Storyboard中的Modal和Push segue有什么区别?

Gau*_*oni 177 objective-c storyboard ios swift

有人可以向我解释modalpushsegue 之间的确切区别是什么?

我知道当我们使用pushsegue时push会将其添加到堆栈中,所以当我们继续使用它时会不断占用内存?

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

Modalsegues可以简单地创建ctrl-click并拖动到目标但是当我使用push我的应用程序崩溃时这样做.

我从一个按钮来推动UINavigationController,有一个UIViewController.

LJ *_*son 173

推Segue公司是加入另一VC到导航堆栈.这假设发起推送的VC是添加到堆栈的VC所属的同一导航控制器的一部分.内存管理不是导航控制器和深层堆栈的问题.只要您正在处理可能从一个VC传递到另一个VC的对象,运行时就会处理导航堆栈.查看图像以获取视觉指示: NavStack

一个模式Segue公司仅仅是一个VC提出另一个VC模态.VC不必是导航控制器的一部分,并且以模态方式呈现的VC通常被认为是呈现(父)VC的"子".模态呈现的VC通常没有任何导航栏或标签栏.呈现VC还负责解雇它创建和呈现的模态VC.

希望这可以帮助.

  • 通常,当您想要显示摘要视图的详细视图时,请使用导航控制器和推送Segues.如果"父"视图与数据关联到"子"视图并不真正相关,则使用模态.模态视图的一个很好的例子是Login视图.就数据与"父"视图有关,Login视图实际上没有任何关系. (42认同)
  • @TJ是的,你可以创建"模型链".解雇链中的VC会使链中的所有VC失效 - 用户只能看到顶级VC关闭(当您启用动画时).它就像导航控制器. (5认同)
  • @jchatard是的.只要您的segue是模态的,在故事板中您将看到导航栏不会被继承.因此,只需单击您拥有的模态链的第一个VC,然后单击菜单编辑器 - >嵌入 - >导航控制器.这将为您设置一个导航控制器,它将对您的所有模态链都是通用的.并不是说那时候只有用于显示导航控制器的segue是"模态的",而你模态链里面的所有segue都必须是"push"segues. (3认同)
  • 只有当你正在使用的VC使用导航控制器时,才能使用推送.尝试从未嵌入导航控制器的VC推送它会引发异常.因此,这与父母和孩子之间的数据连接紧密程度无关,只需要使用导航控制器来管理VC即可.您可以使用模式转换使用segues手动完成相同的操作. (3认同)
  • @EIJay 感谢您的精彩解释。还有一个问题,我什么时候必须使用模式以及什么时候使用推送转场? (2认同)

Fan*_*ing 20

Swift 3.0和XCode 8.2.1更新

1.推Segue

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

在此输入图像描述

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

在此输入图像描述

虽然您可以从不在导航控制器中的视图控制器进行推送segue,但是当您这样做时,您将丢失所有功能,如导航栏,动画,手势等.在这种情况下,您应首先将父视图控制器嵌入导航视图控制器中,然后将push segue嵌入到子视图控制器中.

在此输入图像描述

2.模态争论

另一方面,模态segue(即,模态地存在)呈现在当前视图控制器上.子视图控制器不会继承导航视图控制器,因此如果从带有导航视图控制器的视图控制器中显示模态segue,导航栏将会丢失.您必须再次将子视图控制器嵌入导航控制器中,并在需要时启动全新的导航堆栈.如果要返回父视图控制器,则必须自己实现并dismiss从代码中调用.

在此输入图像描述

模态segue的动画是子视图控制器将从页面底部出现.导航视图控制器也在此演示中消失了

在此输入图像描述


Sim*_*hia 6

推送视图必须构建在一个navigationController.

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

EDITOR->embed in->navigationController
Run Code Online (Sandbox Code Playgroud)