iOS - pushViewController与presentModalViewController的区别

时间:2011-11-08 00:40:22

标签: ios cocoa-touch uinavigationcontroller pushviewcontroller presentmodalviewcontroller

调用presentModalViewControllerpushViewController之间的区别是什么:

  • 动画设置为NO(即使是,这只是一个可以更改的动画风格)。
  • 在呈现模态视图时定义了导航控制器,因此它也可以通过调用堆栈导航,....

这是否能够从第一个推出的视图返回? Woooaaaaaa .....

我猜这种区别在于其他地方和更深层次。不是吗?

5 个答案:

答案 0 :(得分:16)

忽略过渡/动画以及幕后事物的结构(aleph_null提供了很好的讨论),唯一面向用户的区别是能够使用导航栏自动返回上一个视图。

如果您使用pushViewController,您将自动获得"返回"导航栏中的按钮。如果您使用presentModalViewController则不需要,并且通常必须实现自己的控件和/或回调来处理解雇控制器。

从概念上讲,模态表示样式通常用于无法离开的原子任务(即,您要么完成任务,要么取消,并且在您执行其中之一之前,您无法在应用程序中执行任何其他操作)。

如果您想知道为什么首先会有差异,我无法说出来。就个人而言,我认为提供统一API以便从一个控制器移动到另一个控制器(如cocos2d或Android)的框架更有意义。

答案 1 :(得分:12)

最重要的区别在于语义。模态视图控制器通常表示用户必须提供某些信息或执行某些操作。此链接更深入地解释了它:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

这是他们谈论的另一个不那么抽象的差异:

“当您呈现模态视图控制器时,系统会在执行演示的视图控制器和显示的视图控制器之间创建父子关系。具体来说,执行演示的视图控制器将其modalViewController属性更新为指向它呈现的(子)视图控制器。类似地,呈现的视图控制器更新其parentViewController属性以指向呈现它的视图控制器。“

另见此主题:why "present modal view controller"?

答案 2 :(得分:2)

查看图片中的viewControllers

  • 左上角的前2个viewControllers(登录和提交)与 tabBarController&的断开连接 NavigationController
  • 其余的viewControllers嵌入在NavigationController中。它们不知何故属于应用程序的自然流程。

现在你必须问自己

我是否每次都需要始终显示登录+提交页面?即使他们上次登录,每次登录都会给用户带来痛苦。这两个屏幕确实不适合屏幕的自然流量。那么我们该怎么办?我们只是使用presentViewController

以模态方式添加它们

然而,对于其余的viewControllers,我们希望将它们保存在2个导航中,这样我们就可以轻松来回,因此我们使用pushViewController

enter image description here

有关详情,建议您查看video 图像也是从this很好的答案中挑选出来的。它值得一看。

答案 3 :(得分:1)

这就是我的经验所说,如果你想管理一个视图层次结构,最好去导航控制器中的pushViewController。它的工作方式类似于导航控制器中的一组视图控制器。但是,如果要求只是为了显示在父视图控制器上执行某些操作的视图,那么最好的方法是以模态方式呈现它。 如果你需要一个复杂的push pop逻辑,总是喜欢pushViewController。

答案 4 :(得分:0)

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

您可以查看此链接: http://www.icodeblog.com/2011/10/11/back-to-basics-an-introduction-to-view-controllers/