ViewController编程指南概述-视图控制器角色

视图控制器是你的应用程序内部结构的基础。每个应用程序都至少有一个视图控制器,大多数应用程序都有几个。每个视图控制器管理你的应用程序的用户界面的一部分,以及该界面和底层数据之间的相互作用。视图控制器也方便了用户界面的不同部分之间的转换。

因为他们在你的应用程序中扮演这样重要的角色,所以视图控制器是你几乎所有做的应用程序的中心。 UIViewController类定义了用于管理视图,处理事件,从一个视图控制器转换到另一个视图控制器以及与应用程序其他部分协调的方法和属性。 你子类化UIViewController(或它的一个子类),并添加你需要实现你的应用程序的行为的自定义代码。

有两种类型的视图控制器:

  • 内容视图控制器管理应用程序内容的一部分,是您创建的主要类型的视图控制器。
  • 容器视图控制器从其他视图控制器(称为子视图控制器)收集信息,并以便于导航或以不同方式呈现那些视图控制器的内容的方式呈现它。

大多数应用程序是两种类型的视图控制器的混合。

视图管理

视图控制器的最重要的作用是管理视图的层次结构。 每个视图控制器都有单个根视图,其中包含所有视图控制器的内容。 到该根视图,你添加你需要显示你的内容的视图。 图1-1说明了视图控制器及其视图之间的内置关系。 视图控制器总是具有对其根视图的引用,并且每个视图具有对其子视图的强引用。

图1-1 视图控制器及其视图之间的关系

ViewController编程指南概述-视图控制器角色_第1张图片
VCPG_ControllerHierarchy_fig_1-1_2x.png

注:

通常的做法是使用Outlets访问视图控制器视图层次结构中的其他视
图。因为视图控制器管理其所有视图的内容,所以Outlets允许您存储
对所需视图的引用。 当从故事板加载视图时,Outlets本身自动连接到
实际视图对象。

内容视图控制器自身管理其所有视图。 容器视图控制器管理其自己的视图以及来自其一个或多个子视图控制器的根视图。 容器不管理它的孩子的内容。 它只管理根视图,根据容器的设计调整大小和放置它。 图1-2说明了拆分视图控制器与其子代之间的关系。 分割视图控制器管理其子视图的总体大小和位置,但是子视图控制器管理这些视图的实际内容。

图1-2 视图控制器可以管理来自其他视图控制器的内容

ViewController编程指南概述-视图控制器角色_第2张图片
VCPG_ContainerViewController_fig_1-2_2x.png

数据封送处理

视图控制器充当它管理的视图和应用程序的数据之间的中介。 UIViewController类的方法和属性使您可以管理应用程序的可视化呈现。 当你子类化UIViewController,你添加任何变量,你需要管理你的子类中的数据。 添加自定义变量会创建如图1-3所示的关系,其中视图控制器引用了您的数据和用于呈现该数据的视图。 在两者之间来回移动数据是您的责任。

图1-3视图控制器在数据对象和视图之间进行中介

ViewController编程指南概述-视图控制器角色_第3张图片
VCPG_CustomSubclasses_fig_1-3_2x.png

您应该始终在视图控制器和数据对象中保持清晰的责任分离。 大多数确保数据结构完整性的逻辑都属于数据对象本身。 视图控制器可以验证来自视图的输入,然后以数据对象需要的格式打包输入,但是您应该最小化视图控制器在管理实际数据中的角色。

UIDocument对象是一种独立于视图控制器管理数据的方法。 文档对象是知道如何读取和写入数据到永久存储器的控制器对象。 当你子类化,你添加任何逻辑和方法,你需要提取的数据,并将它传递给视图控制器或应用程序的其他部分。 视图控制器可能存储其接收的任何数据的副本,以便更新视图,但文档仍然拥有真实数据。

用户交互

视图控制器是响应者对象,并且能够处理响应者链中发生的事件。 虽然他们能够这样做,但是视图控制器很少直接处理触摸事件。相反,视图通常处理自己的触摸事件,并将结果报告给关联的委托或目标对象的方法,这通常是视图控制器。 因此,视图控制器中的大多数事件都使用委托方法或操作方法来处理。

资源管理

视图控制器对其视图及其创建的任何对象承担全部责任。 UIViewController类自动处理视图管理的大多数方面。 例如,UIKit自动释放任何不再需要的视图相关资源。 在您的UIViewController子类中,您负责管理明确创建的任何对象。

当可用内存不足时,UIKit要求应用程序释放任何不再需要的资源。 它的一个方法是通过调用视图控制器的didReceiveMemoryWarning方法。 使用该方法来删除对不再需要的对象的引用,或稍后可以轻松重新创建。 例如,您可以使用该方法来删除缓存的数据。 当低内存条件发生时,释放尽可能多的内存是非常重要的。 消耗太多内存的应用程序可能会被系统彻底终止以恢复内存。

适应性

视图控制器负责呈现它们的视图以及适配该呈现以匹配底层环境。 每个iOS应用程序应该能够在iPad和几个不同大小的iPhone上运行。 不是为每个设备提供不同的视图控制器和视图层次结构,而是使用单个视图控制器来更容易地使其视图适应不断变化的空间需求。

在iOS中,视图控制器需要处理粗粒度更改和细粒度更改。 粗粒度的改变发生在视图控制器的特性改变时。 特性是描述整体环境的属性,例如显示比例。 两个最重要的特性是视图控制器的水平和垂直大小类,它们指示视图控制器在给定维度中有多少空间。 您可以使用大小类更改来更改视图的布局方式,如图1-4所示。 当水平大小类是规则的时,视图控制器利用额外的水平空间来布置其内容。 当水平尺寸类紧凑时,视图控制器垂直地布置其内容。

图1-4 将视图适配到大小类更改

ViewController编程指南概述-视图控制器角色_第4张图片
VCPG_SizeClassChanges_fig_1-4_2x.png

在给定的大小类中,可以随时发生更细粒度的大小变化。 当用户将iPhone从纵向旋转到横向时,尺寸类别可能不会更改,但屏幕尺寸通常会更改。 当您使用自动布局时,UIKit自动调整视图的大小和位置以匹配新的维度。 视图控制器可以根据需要进行其他调整。

你可能感兴趣的:(ViewController编程指南概述-视图控制器角色)