ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁。且应用程序至少有一个view controller。每个view controller对象都负责和管理一个view对象,称此对象为root view,其组织和管理以root view为根的视图层次结构。
图 11
可以将view controller分为两种类型:
1) Content:用于管理视图中的分散view控件,这些分散view控件是app中的主要实体。
2) Container:作为一种容器,用于存放和管理其它view controller,从而实现导航和表示。
1 Root View Controller
Root view controller(简写为RVC)是所有 view controller的支柱,并且window使用RVC来填充其内容视图,即RVC作为window的子视图,app将所有可视化组件都放在了RVC之中,或者是RVC子视图中,如图 12所示。
图 12 The root view controller
在UIWindow对象中有一个rootViewController属性,其描述root VC对象。如果通过storyboards配置VC,那么UIKit会自动设置UIWindow的rootViewController属性;若通过程序创建window,那么需要手动设置window的rootViewController属性。
2 Container View Controllers
Container view controllers(简写为CVC)可以将离散的视图或组件装配成复杂的app,从而能够复用这些组件或视图。UIKit定义了一些CVC容器,有UINavigationController、 UISplitViewController和UIPageViewController。
CVC负责管理子view controller的空间布局和位置,并且经常作为Root view controller,若图 13所示。当然CVC可以作为任何 view controller的父容器,包括其它的CVC。
图 13 A container acting as the root view controller
3 Presented View Controllers
Presented View Controllers(简写为PVC)经常用于替换当前显示的view controller,即将PVC作为新显示的内容。当present一个新的view controller作为显示的内容,那么UIKit将会为presenting view controller 和presented view controller之间创建一种关系,如图 14所示。
图 14 Presented view controllers
当present一个新的view controller时,UIKit会寻找一个能提供合适上下文的Container view controllers,大多数情况下是选择离最近的Container view controllers;有时需要用户手动指定Container view controllers作为这次present提供的上下文。
如图 15所示,描述了一个涉及Container view controllers的present操作,当屏幕显示黄色了是view时,present了绿色的视图。这时不是将黄色view所关联的controller作为presenting view controller,而是将navigation controller作为presenting view controller。
图 15 A container and a presented view controller