iOS – pushViewController vs presentModalViewController的区别

当调用presentModalViewControllerpushViewController ,有什么区别:

  • animation设置为NO(即使是的,这只是一个可以改变的animation风格)。
  • 一个导航控制器是在呈现模态视图时定义的,所以也可以通过调用堆栈来导航。

这只是为了能够从第一个推送的视图回来? Woooaaaaaa …..

我想这个区别是在其他地方和更深的。 没有?

最重要的区别是关于语义。 模态视图控制器通常指示用户必须提供一些信息或做某事。 这个链接更深入地解释了它: http : //developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

以下是他们谈论的另一个较不抽象的区别:

“当你展示一个模式化的视图控制器时,系统在呈现视图的控制器和呈现的视图控制器之间创build一个父子关系,具体地说,呈现的视图控制器更新它的modalViewController属性来指向它的呈现(子)视图控制器,同样,呈现的视图控制器更新其parentViewController属性,指向显示它的视图控制器。

也看到这个线程: 为什么“目前的模态视图控制器”?

忽略转场/animation以及场景结构(aleph_null的提供了一个很好的讨论),唯一面向用户的区别是能够使用导航栏自动返回到前面的视图。

如果您使用pushViewController您将自动在导航栏中获得“返回”button。 如果使用presentModalViewController ,则不需要,通常必须实现自己的控件和/或callback来处理解除控制器。

从概念上讲,模式表示风格通常用于无法离开的primefaces任务(即,您可以完成任务,或者取消任何其他任务,除非执行另一个任务,否则无法在应用程序中执行其他任何操作)。

如果你想知道为什么有差异,我不能说。 就个人而言,我认为提供统一的API从一个控制器移动到另一个控制器(如cocos2d,或Android)的框架更有意义。

这就是我的经验所说的,如果你想pipe理视图层次结构,最好在导航控制器中使用pushViewController。 它在导航控制器中像一堆视图控制器一样工作。 但是,如果要求只是显示在父视图控制器上执行某些操作的视图,那么最好的方法是以模态方式显示它。 如果你需要一个复杂的推popup逻辑总是喜欢pushViewController。

看看图中的viewControllers

  • 左上angular的2个viewController(login&submit)与tabBarController &NavigationController 断开连接
  • viewControllers的其余部分embedded在NavigationController中。 它们以某种方式属于应用程序的自然stream动。

现在你必须问自己

我是否需要每次都显示login+提交页面? 即使上次login,每次login都会让用户感到痛苦。 这两个屏幕真的不适合屏幕的自然stream动 。 那么我们该怎么办? 我们只需使用presentViewController模态添加

但是对于viewControllers的其余部分,我们希望将它们放在2个导航中,这样我们就可以轻松地来回移动,所以我们使用pushViewController

在这里输入图像说明

欲了解更多信息,我build议你看看这个video图像也摘自这个伟大的答案。 值得一看。

UINavigationController用于当您想要某种分层的数据表示(即向下钻取)时。 他们使用一堆UIViewController子类。 每次“下钻”时,只需将另一个视图控制器添加到堆栈。 然后,“后退”逻辑就是将视图控制器从堆栈中popup的问题。

你可以看看这个链接: http : //www.icodeblog.com/2011/10/11/back-to-basics-an-introduction-to-view-controllers/