View Controller 基本知识(一)

由于iOS设备有限的屏幕尺寸,App并不是可以随心所欲的显示自己的内容,因此如何展现信息给用户是一件很有创造力的事情。App有很多信息需要展示但是只能从显示部分开始,然后根据用户的交互需求显示或隐藏其他的内容。视图控制器对象提供了管理内容和协调显示或隐藏内容的基础功能接口。通过不同的视图控制器可以控制UI的各自分离的部分,可以将UI的实现分割成更小的UI单元方便更好的管理。

在具体使用视图控制器之前,我们必须对iOS中用来显示内容的主要的类有一个基本的理解,包括windows和views。任何视图控制器实现接口的一个重要的部分就是管理用于显示内容的视图元素。但是,管理视图元素并不是视图控制器的唯一工作。大多数视图控制器也同其他视图控制器通讯和协调在转场时。视图控制器管理的链接,有时候挺难理解。相反,使用Storyboards创建UI会非常容易地形象化视图控制器的关系,并且极大地简化了在运行时初始化对象所需的工作。

1.Screens,Windows和Views创建可视化接口

图1-1描述了一个简单的接口。左图接口中,我们可以清楚的看到组成这些接口的对象,如此就很容易理解这些对象之间是如何联系的。

View Controller 基本知识(一)_第1张图片
图1-1 A window with its target screen and content views

这里有三个主要对象:

1)UIScreen: 和设备的物理屏幕联系在一起,编程不会与之发生直接操作;

2)UIWindow: 提供屏幕的视图绘制功能;

3)UIView: 需要绘制的内容,这些对象附加在window之上,并且根据window的指令绘制内容。

图1-2描述了这些类在UIKit中的定义。

View Controller 基本知识(一)_第2张图片
图1-2 Classes in the view system

虽然搞清楚视图控制器不需要理解视图元素的所有内容,但是这对于总结视图元素的大多数特点是非常有意义的:

1)一个view代表一个UI元素,每个view覆盖一个特定区域,在个区域内显示内容或响应用户事件;

2)view在视图层级中可以嵌套存在,子视图根据父视图定位和绘制,所以,父视图移动的同时子视图也是跟着移动的。这种层级结构很容易把一组相关的视图装配在一个普通的父视图之内。

3)通过修改属性值视图可以产生动画。当属性值变化后,这个值逐渐地从旧值通过一种定义好的时间周期过渡到新值。多个视图对象的多个属性值的在单一的动画中可以协调变化。

4)视图很少理解在App中扮演的角色。例如图1-1中的hello按钮,就是一类特定的控制类视图。这个控制类视图明白如何响应区域内用户的交互行为,但是它们不清楚自己的控制内容。相反,当一个用户与控制类视图发生交互,视图会发送消息给App内的其他对象。这种灵活性允许一个单一的类(如UIButton)提供实现给多个按钮,每个按钮配置了触发不同的动作响应。

一个复杂的App需要很多视图,这些视图经常组成视图层级的形式存在。这需要激活这些视图的子视图的显示或隐藏在屏幕上为更高层次的界面提供幻想。最终,保持视图元素的复用,并且视图元素没有必要知晓它们在App中的角色。所以App的逻辑,即核心,需要放置在某个地方,视图控制器就是将App视图组织在一起的核心所在。

2.视图控制器管理视图

每个视图控制器组织和控制一个视图,这个视图经常是视图层级的根视图。视图控制器作为MVC模式中的控制对象,iOS通常期望一个视图控制器处理一定的任务。这些任务定义在被其他视图控制器继承的UIViewController中。所有的视图控制器处理视图和资源的管理任务;其他的响应依赖于视图控制器的使用方式。

图1-3描述了一个来自于图1-1的接口,区别在于使用了一个视图控制器。iOS从来不会直接分配视图给window,相反,可以分配一个视图控制器给window,并且视图控制器自动地添加它的视图给window。

View Controller 基本知识(一)_第3张图片
图1-3 A view controller attached to a window automatically adds its view as a subview of the window

视图控制器会非常小心的加载它的视图仅当这个视图需要的时候,同时也可在一定条件下释放这个视图。由于这些原因,视图控制器在资源管理中具有关键性的作用。

一个视图控制器就是协调其内部相关联的视图之间的动作的理想之地。例如,当一个按钮被按下,会发送一条消息给视图控制器。虽然视图可能不清楚本身执行的任务,但是视图控制器被期望理解按钮按下的含义和如何响应按钮按下事件。控制器可能会更新数据对象,动画或者更变存储在视图中属性值,甚至将其他视图控制器的内容显示到屏幕上。

通常,每个被App实例化的视图控制器只能看到App数据的一部分。视图控制器清楚如何显示这部分数据,并不需要知道其类型的数据。所以,一个App的数据模型,UI设计,和我们创建的视图控制器都是受彼此影响的。

图1-4描述了一个食谱管理的App,这个App显示了三个相关但独立的视图。第一个视图以列表的形式展示了所管理的食谱。单击一个食谱单元格会显示第二个描述食谱的详情视图,在详情视图中单击食谱的图片会显示第三个视图,放大了的食谱照片。每个视图被一个独立的视图控制器管理,这个视图控制器的工作就是显示合适的视图,根据数据填充子视图,和在视图层级内响应用户的交互行为。

View Controller 基本知识(一)_第4张图片
图 1-4 Distinct views managed by separate view controllers

这个例子演示了视图控制器一些常用的元素:

1)每个视图仅仅被一个视图控制器控制,当一个视图被分配给视图控制器的视图属性,这个视图控制器就会拥有此视图。如果这个视图是子视图,它可能被同一个或者不同的视图控制器控制。我们将在容器视图管理中学到更多关于如何使用多个视图控制器组织一个单一的视图层级结构。

2)每个视图控制器只会跟部分App数据交互。比如,在相片视图控制器中需要知道的仅仅是要显示的相片。

3)因为每个视图控制器只提供了用户体验的部分数据,视图控制器之间必须通讯才能使这种体验很平滑。它们可能同时需要和其他控制器通讯,比如数据控制器和文档对象。

你可能感兴趣的:(View Controller 基本知识(一))