【问题标题】:What are the benefits of using a UINavigationController over adding a view with addSubView?与使用 addSubView 添加视图相比,使用 UINavigationController 有什么好处?
【发布时间】:2016-01-09 12:32:49
【问题描述】:

假设我有两个页面,其中有两个 UIViewControllersUIViewController1UIViewController2

如果我想在UIViewController1 上显示UIViewController2,我有三个选择:

  1. 使用UINavigationControllerpushViewController
  2. 使用presentViewController
  3. addSubView : UIViewController1.view.addSubView(UIViewController2.view)

如果我需要在我的视图之间进行转换,我更喜欢第三个选项,因为它可以让我更好地控制视图。

这三个选项在性能方面有什么区别吗?

【问题讨论】:

    标签: ios performance ios8 uinavigationcontroller ios9


    【解决方案1】:

    在 iOS 6 之前,您不应该执行选项 3。视图控制器旨在控制整个屏幕。在 iOS 6 中,Apple 添加了对父视图控制器和子视图控制器的支持。您可以让另一个视图控制器成为您的孩子并将其内容视图添加到您的孩子。

    如果您要使用选项 3,那么这就是您需要做的。如果你不这样做,你会遇到各种各样的问题。

    甚至支持故事板中内置的父/子视图控制器。您可以将容器视图添加到视图控制器,然后控制从容器视图拖动到另一个视图控制器的场景。当您这样做时,系统会创建一个“嵌入转场”,在容器视图中设置子视图控制器并为您连接父/子关系。

    当您希望新的视图控制器替换或至少覆盖第一个视图控制器时,您的前 2 个选项是。选项 3 用于当您希望屏幕的某个区域由另一个视图控制器管理时。

    选项 3(使用子视图控制器)确实意味着两个视图控制器将同时处于活动状态并在内存中,因此您不能像在推送中那样释放覆盖的视图控制器的数据存储,而它处于非活动状态或模态演示。但是,除非您的视图控制器拥有并呈现巨大的数据结构,否则这并不是什么大问题。在推送和模态演示中,被覆盖的视图控制器无论如何都会停留在内存中,等待被发现。您必须采取特殊步骤才能在视图控制器的视图被覆盖时释放任何内存,然后在它再次显示时重新分配它 - 这是不寻常的。

    【讨论】:

    • 感谢您的回答,所以使用第一个选项我可以释放以前的控制器,但使用第一个我不能! .您能否给我一个教程链接,该教程描述如何使用 UINavigationController 释放内存,然后在用户按下后退按钮时再次重新创建 viewController。
    • 不,您不能在您正在谈论的任何方案中释放以前的视图控制器。在模态演示中,新的视图控制器显示在前一个视图控制器之上。使用导航控制器,推送一个新的视图控制器会将新的视图控制器添加到导航堆栈中,并且所有以前的视图控制器都会保留。
    • 我说的是代表您在 VC 中显示的内容的模型数据。您可以对视图控制器进行编码,以便它们在它们不在屏幕上时释放它们的模型对象,并在它们回来时重新加载它,但大多数人不这样做。 (顺便说一句,数字 2 的词是“二”,而不是“拖”。)
    • 非常感谢,但如果我跟踪视图层次结构,我也可以使用第三个选项发布模型。它只是一点点工作。对吗?
    • 可能不会,不。如果子视图控制器仍在屏幕上并处于活动状态,您将如何释放它的模型数据?
    【解决方案2】:

    仅对于两个视图控制器,它不会产生重大差异。 UINavigationController 主要用于维护导航栈。

    但由于您只有两个视图控制器,您也可以使用其他方式。

    如果您正在寻找带有 NavigationController 的过渡,您可以使用 UIView 过渡来自定义推送弹出动画。

    UIView 过渡请参考以下链接

    https://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/

    http://www.raywenderlich.com/86521/how-to-make-a-view-controller-transition-animation-like-in-the-ping-app

    https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

    http://applidium.github.io/ADTransitionController/

    【讨论】:

    • 感谢您的回答,如果我有 4 个视图控制器,这会影响性能还是其他什么?
    • 我认为它不会对性能造成任何问题。但是您只需要维护视图层次结构。
    • 欢迎您,没问题,您可以等待。如果您需要任何其他帮助,请随意
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多