iOS - pushViewController 与 presentModalViewController 的区别

Posted

技术标签:

【中文标题】iOS - pushViewController 与 presentModalViewController 的区别【英文标题】:iOS - pushViewController vs presentModalViewController difference 【发布时间】:2011-12-24 02:01:32 【问题描述】:

调用presentModalViewControllerpushViewController 有什么区别,当:

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

这只是为了能够从第一个推送视图返回吗?呜呜呜……

我想区别在别处和更深的地方。没有?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这是最重要的区别!【参考方案2】:

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

这是他们谈论的另一个不太抽象的区别:

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

另请参阅此主题:why "present modal view controller"?

【讨论】:

【参考方案3】:

查看图片中的 viewControllers

左上角的前 2 个视图控制器(登录和提交)与 tabBarController 和 NavigationController断开 其余的 viewController 嵌入在 NavigationController 中。它们在某种程度上属于应用的自然流程。

现在你得问问自己了

我是否需要每次都显示登录 + 提交页面?即使用户上次登录,每次登录都会很痛苦。这两个屏幕确实不适合屏幕的自然流动。那么我们该怎么办?我们只是使用presentViewController 模态添加它们

但是对于其余的 viewController,我们希望将它们保留在 2 个导航中,以便我们可以轻松地来回移动,所以我们使用pushViewController

有关更多信息,我建议您查看此video 这张图片也是从this很好的答案中挑选出来的。值得一看。

【讨论】:

【参考方案4】:

这就是我的经验,如果你想管理视图的层次结构,最好在导航控制器中使用 pushViewController。它就像导航控制器中的一堆视图控制器一样工作。但是,如果要求只是显示在父视图控制器上执行某些操作的视图,那么最好的方法是以模态方式呈现它。 如果您需要复杂的推送弹出逻辑,请始终使用 pushViewController。

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于iOS - pushViewController 与 presentModalViewController 的区别的主要内容,如果未能解决你的问题,请参考以下文章

iOS - pushViewController 没有滑动背景图片

iOS 7 中的 PushViewController

在 pushViewController (iOS 11) 之后 NavigationBar 高度未更新

iOS - pushViewController 推送到 nil 视图控制器

pushViewController无法使用IOS11 SDK

使用 pushViewController 加载 TableViewController 后没有发生 Ios-Segue 到 UIViewController