💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC=5] * * * * * >原文链接 :[The Role of View Controllers](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/index.html#//apple_ref/doc/uid/TP40007457-CH2-SW1) 视图控制器是你的应用程序内部结构的基础。 每个应用程序至少有一个视图控制器,大多数应用程序有几个。 每个视图控制器管理你的应用程序用户界面中的一部分,以及该界面和底层数据之间的交互。 视图控制器也便于您的应用在不同用户界面的之间的转换。 由于在你的应用中扮演着如此重要的角色,视图控制器几乎是你所做的一切的中心。 UIViewController 类定义了用来管理视图,处理事件,从一个视图控制器转换到另一个视图控制器,以及协调你的应用程序的其他部分的方法和属性。 您可以继承 UIViewController(或其子类之一)并添加实现应用程序行为所需的自定义代码。 视图控制器分两种类型: * 内容视图控制器,管理你的应用程序内容的一个离散部分,主要使用类型。 * 容器视图控制器,用方便导航的形式管理和展示子视图控制器的内容。 大多数应用程序是两种类型的视图控制器组合而成。 ### 视图管理 视图控制器最重要的作用是管理视图的层次结构。 每个视图控制器都有一个包含所有视图控制器内容的根视图。 在根视图中,可以添加需要显示内容的视图。 图1-1显示了视图控制器和视图之间的内在关系。 视图控制器总是具有对其根视图的引用,并且每个视图都具有对其子视图的强引用。 ###### 图 1-1 视图控制器与其视图之间的关系 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_ControllerHierarchy_fig_1-1_2x.png) > 注意 > 通常的做法是使用 outlets 访问视图控制器的视图层次结构中的其他视图。 由于视图控制器管理其所有视图的内容,因此可让您存储对所需视图的引用。 当视图从故事板加载时, outlets 本身自动连接到实际的视图对象。 内容视图控制器自己管理其所有视图。 容器视图控制器管理其自己的视图以及来自其一个或多个子视图控制器的根视图。 其不管理其子视图控制器的具体内容。 它只管理子视图控制器的根视图,根据容器的设计大小对根视图进行布局。 图 1-2 说明了 UISplitViewController 及其子项之间的关系。 UISplitViewController 管理其子视图控制器的根视图的大小和位置,子视图控制器的根视图管理这些视图的实际内容。 ###### 图1-2 视图控制器管理来自其他视图控制器的内容 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_ContainerViewController_fig_1-2_2x.png) 有关管理视图控制器视图的信息,请参阅 [Managing View Layout](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DefiningYourSubclass.html#//apple_ref/doc/uid/TP40007457-CH7-SW6)。 ### 数据传递 视图控制器充当它管理的视图和你的应用的数据之间的媒介。 UIViewController 的方法和属性方便管理应用程序的展示内容。 当你的子类继承UIViewController的时候,你可以在子类中添加任何变量以便管理你的数据。 添加自定义变量会创建一个如图 1-3 所示的关系,其中视图控制器具有对数据以及用来展示数据视图的引用。 需要你在两者之间来回传递数据。 ###### 图1-3 视图控制器在数据对象和视图之间进行协调 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_CustomSubclasses_fig_1-3_2x.png) 你应该始终在视图控制器和数据对象之间保持清晰的职责分离。 大多数确保数据结构完整性的逻辑属于数据对象本身。 视图控制器可以验证来自视图的输入,然后以数据对象需要的格式打包输入,但是应该最小化视图控制器在管理实际数据中的角色。 UIDocument 对象是一种独立于视图控制器管理数据的方法。 文档对象是一个知道如何读写数据到持久存储的控制器对象。 当你子类化时,你可以添加任何你需要的逻辑和方法来提取数据,并将其传递给视图控制器或其他应用程序的一部分。 视图控制器可以存储它接收的任何数据的副本,以便更新视图,但文档仍然拥有真正的数据。 ### 用户交互 视图控制器是响应者对象,能够处理响应者链中的事件。 虽然他们能够这样做,但视图控制器很少直接处理触摸事件。 相反,视图通常会处理自己的触摸事件,并将结果报告给关联的委托或目标对象(通常是视图控制器)的方法。 因此,视图控制器中的大多数事件都是使用委托方法或操作方法处理的。 有关在视图控制器中实现操作方法的更多信息,请参阅 [Handling User Interactions](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DefiningYourSubclass.html#//apple_ref/doc/uid/TP40007457-CH7-SW11) 。 ### 资源管理 视图控制器负责管理其视图和其创建的任何对象。 UIViewController 自动完成视图管理的大多数工作。 例如,UIKit 自动释放视图不再需要的任何相关的资源。 在你的UIViewController 子类中,你负责管理自己创建的对象。 当可用空闲内存不足时,UIKit 会要求应用程序释放不再需要的资源。其中一种方式是通过调用视图控制器的 didReceiveMemoryWarning 方法。 使用该方法删除对不再需要或稍后可以轻松地重新创建的对象。 例如,可以使用该方法删除缓存的数据。 发生内存不足情况时,尽可能多的释放内存非常重要。 消耗太多内存的应用程序可能会被系统彻底终止以恢复内存。 ### 适应性 视图控制器负责呈现其视图内容并使根据基础环境对视图进行适配。 每个iOS应用程序都应该能够在iPad上运行,并且可以在几种不同大小的iPhone上运行。 与其为每个设备提供不同的视图控制器和视图层次结构,不如使用单个视图控制器通过简单地调整其视图以适应不断变化的空间需求。 在iOS中,视图控制器需要处理粗粒度的变化和细粒度的变化(很有可能指分辨率)。当视图控制器的特性改变时,会发生粗粒度的变化。 特性是描述整体环境的属性,例如显示比例。 其中两个最重要的特性是视图控制器的水平和垂直尺寸,它们表示视图控制器在给定维度中有多少空间。 您可以使用 size class 更改来改变布局视图的方式,如图1-4所示。当水平尺寸类别是正常的,视图控制器利用额外的水平空间来排列其内容。 当水平尺寸级别紧凑时,视图控制器垂直排列其内容。 ###### 图1-4 调整视图以适应尺寸变化 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_SizeClassChanges_fig_1-4_2x.png) 在一个给定的空间中,在任何时候都有可能出现更细粒度的更改。当用户将iPhone从竖屏转到横向时,空间大小可能不会改变,但屏幕尺寸通常会发生变化。当你使用自动布局时,UIKit 会自动调整视图的大小和位置以匹配新的维度(坐标系)。视图控制器可以根据需要进行额外的调整。 有关适应性的更多信息,请参见 [The Adaptive Model](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html#//apple_ref/doc/uid/TP40007457-CH19-SW1)。