1、预览
1.1、ViewController的职责
ViewController
是应用本质架构的基础,每个app最少有一个,大部分都会有很多view controller
。每个view controller
管理你的app的用户界面的一部分及界面和底层数据之间的相互作用。同时,view controller
也便于用户界面的不同部分之间的切换。
鉴于如此重要的角色,view Controller
几乎是你所做一切事情的中心。UIViewController
定义了方法和属性用来管理你的view
,处理事件,从一个ViewController
跳转到另外一个,与你的其他app进行协调。你需要做的就是继承UIViewController
,然后添加自定义代码用来实现你的app的行为。
view controller
有两种类型:
-
content view controller
管理你的app的一系列内容,这是比较常用的。 -
container view controller
会从其他viewcontroller
收集信息,从某种程度上来讲,有利于导航或显示不同的viewcontroller
。
大部分的app会同时使用两种viewController
。
** 管理View **
viewcontroller
最重要的职责就是管理view
的层次结构。每一个veiwcontroller
有一个唯一的root view
,包含所有的view Controller
的内容。你需要把所有想要展示的内容添加到root view
上。view controller
一直对root view
保持引用,同时root view
会对每一个子view保持强引用。下图说明了view controller
和view
的关系。
content view controller
自己管理所有的View
。container view Controller
除了管理自己的view
之外,还有其他一个或多个子view Controller
的root view
,但是容器并不管理子view Controller
的内容,仅管理子view Controller
的root view
,大小,还有根据容器设计的布局。下图解释了一个分离的view controller
和它的children。这个分离的View Controller
管理着全部的child view
的大小和布局,但是实际上child view controller
管理这些view
的内容。
** 数据处理**
view controller
是view
和数据的中介。UIViewController
的方法和属性管理你的应用的展示。你可以继承UIViewController
,然后在子类中添加一些你需要的变量,管理你的数据。添加自定义变量创建的关系图如下图所示,view controller
对数据进行引用,然后通过view
对数据进行展示。你需要做的就是处理这些数据。
你应该一直要维护view controller
和data object
清晰的职责区分。大多数确保数据的完整性结构的逻辑属于数据的本身。view controller
的可能只需验证从view
的数据输入,然后转换成data object
需要的格式,但是你应该最小化View controller
在管理实际数据的职责。
UIDocument
是一种使view controller
和data
隔离的方式。文件对象是一个控制器对象知道怎么去读写数据进行持久化存储。当你继承这个类,你需要添加一些逻辑和方法去提取数据,传递数据到view controller
或你的应用的其他部分。view controller
会保留这些数据的一些拷贝,以便于更新view
,但是文件会一直保留这些真实的数据。
**用户交互 **
view controller
为它创建的对象及view
承担所有职责。UIViewController
类处理大多数view
的自动化管理。例如,UIKit自动化释放一些不在需要的与View相关的资源。在继承UIViewController
的子类中,你要明确的负责管理你创建的对象。
当可用的空闲内存比较低是,UIKit
会请求应用去释放一些不在使用的资源。一种方式就是去调用View Controller
中的didReceiveMemoryWarning
方法。利用这个方法去移除应用中空闲对象的引用,或者稍后可以方便创建的对象。例如,可以利用这个方法去移除缓存数据。当低内存的条件发生时,这个是非常重要的能释放尽可能多的内存,因为应用消耗太多内存,系统为了回收内存会强制性的中断。
适应性
viewController
负责view
的显示和适配底层环境。每个iOS应用应该可以运行在多种型号的iPhone上。最简单的方法就是使用view Controller
使自己的view
适配多种布局需求。
在iOS中,view Controller
需要处理粗粒度的变化和细粒度的变化。粗粒度的变化是指view controller
的特征改变,这里的特征指整个环境,比如展示比例变化等。两个最重要的特征是view controller
的垂直和水平尺度,预示着view
有多大的布局空间。当水平大小属性为regular
时,view controller
会使用整个垂直空间去安排内容。当垂直大小设置为compact
时,view controller
会垂直的安排内容,如下图所示。
在给定的size
类中,更多的是细粒度的大小变化。当用户旋转iPhone时,size不会变,但是屏幕尺寸会变化。当你使用Auto Layout
时,UIKit
会自动化调整size和view的定位以匹配新的尺寸。若有需要,View Controller
也可以进行 额外的调整。