视图控制器是应用程序内部结构的基础,每个APP至少都有一个视图控制器,实际情况中大多数APP都会有多个。视图控制器管理用户界面的一部分同时负责用户界面和底层数据之间的交互。视图控制器也使用户界面不同部分之间的过渡更方便。
因为视图控制器在APPs中扮演中如此重要的角色,所以视图控制器基本上是你做任何事情完成任何功能的中心。类 UIViewController 定义了很多方法和属性,用来管理你的视图,事件处理,在不同视图控制器之间的过渡,与应用程序其他部分之间的坐标位置。你可以继承UIViewController或者它的任何一个子类,向你继承的类中添加你需要用来实现你应用程序特性的自定义代码。
视图控制器中有两个类型:
-内容视图控制器 管理应用程序中的离散内容,是你创建的视图控制器的主要类型。
-容器视图控制器 在其他视图控制器(被称为子视图控制器)之间收集信息,并且用一种有利于引导的方式来呈现信息或者呈现这些视图控制器中的不同信息。
大多数APPs都是上述这两种类型的混合类型。
视图管理
视图控制器扮演的最重要的角色是管理视图之间的层次结构。每个视图控制器都有一个唯一的根视图,用来围绕住视图控制器的所有内容。在这个根视图上可以添加你需要用来显示你内容的视图。图1-1说明了视图控制器和它的视图之间的内在关系。视图控制器总是有一个指向根视图的引用,且每个视图都有一个指向它的子视图的强引用。
图1-1 视图控制器和它的视图之间的关系
-注意:在实践中常用outlets来访问视图控制器的视图层次结构中的其它视图。因为一个视图控制器管理它的所有视图的内容,outlets可以放置你需要存放的视图的引用。当视图从storyboard加载时,outlets可以自动连接实际的视图对象。
一个内容视图控制器管理它自己的所有视图。一个容器视图控制器管理它自己的所有视图再加上来自它的一个或者多个子视图控制器的根视图。容器不管理容器内对象的内容,它仅仅管理根视图,并且根据容器的设计来设置根视图的大小和位置。图1-2说明了split view controller 和它的子对象之间的关系。split view controller 管理它的子视图的整体大小和位置,同时子视图控制器管理这些视图的实际内容。
图1-2 试图控制器可以管理其它试图控制器的内容
更多关于管理视图控制器的视图的信息,see Managing View Layout.
Data Marshaling (Marshaling 不知该怎么翻译才好)
视图控制器在它管理的视图和应用程序的数据之间扮演一个中间角色。类UIViewController 的方法和属性可以让你管理应用程序的可视显示。当你子类化UIViewController 时,你可以在字累中添加任何你需要用来管理你的数据的变量。添加的自定义变量创建了如图1-3的关系,图中视图控制器有一个指向数据的引用,而视图用来呈现视图控制器指向的数据,同时你得负责视图控制器所用到的数据在后台和视图之间的交互和移动操作。
图1-3 视图控制器调解数据对象和视图
你应该总是维持你的视图控制器和数据对象之间是完全分离的状态。为了确保你的数据结构的完整性,大多数逻辑属于数据对象本身。视图控制器可能会验证来自视图的输入,然后将来自视图的输入打包成你的数据对象需要的格式来输入,但是你应该最小化视图控制器在管理实际数据时的作用。
UIDocument 对象时一种可以让你的数据从视图控制器中分离的方法,一个document对象是一种控制器对象,而且它知道怎样读取和写入持久存储的数据。当你子类化UIDocument时,你可以添加任何你需要的逻辑和方法用来提取数据,然后传递数据给一个视图控制器或者时你应用程序的其它部分。视图控制器可能会存储它接收到的数据的一个备份,用来让更新视图更加容易,但是document对象仍然拥有真实的数据。
用户交互
视图控制器是一种responder objects,具有处理来自响应链事件的能力,尽管视图控制器可以这样做,但是视图控制器很少直接处理touch事件。Instead,视图通常处理它们自己的touch事件,然后把结果通知给与其关联的delegate或者target object,当然这样的delegate或者target object通常是该视图所属的视图控制器。所以,一个视图控制器中的大多数事件都是使用delegate methods 或者是action methods来处理。
更多关于在你的视图控制器中实现action methods的信息,see Handling User Interactions.。更多关于处理其它类型事件的信息,see Event Handling Guide for iOS。
资源管理
一个视图控制器对它拥有的所有视图和它所创建的所有对象负责。类 UIViewController 自动处理视图管理的大多数方面。例如,UIKit 自动释放不再需要的视图相关联资源。在你的UIViewController子类中, 你得负责管理你显示创建的任何对象。
当系统中可用的内存正在迅速的减少时,UIKit 要求所有应用程序释放它们已经不再使用的资源,处理这种问题的一个方法是在你的视图控制器中调用didReceiveMemoryWarning方法,使用这个方法来移除你不在需要或者是之后可以很容易重新创建的引用对象。例如,你可能使用这个方法来移除缓存数据。当低内存情况出现时,在你的应用程序中尽可能多的释放内存时很重要的。为了恢复内存,如果你的应用程序消耗了太多的内存的话,系统可能会直接终止你的应用程序。
自适应性
视图控制器负责它们视图的显示,同时得根据底层的设备环境来调整匹配视图的显示。每个IOS app都应该能够运行在iPad和一系列不同尺寸的iPhone上,而不是为每个设备提供不同的视图控制器和视图层次结构,使用单一的视图控制器来调整它的视图以适应空间需求的改变通常是更简单的做法。
在IOS中,视图控制器需要处理粗粒度(coarse-grained) 和细粒度(fine-grained)的改变。当一个视图控制器的traits改变时粗粒度也发生了改变,traits是用来描述整体环境的属性,比如显示比例。两个最重要的traits是视图控制器的水平和垂直size classes,它们用来指示视图控制器在被给予的范围内有多少空间,你可以通过使用size class的改变来改变你放置视图的方法,如图1-4. 当水平size class 是regular时,视图控制器可以充分利用额外的水平空间来组织它的内容。当水平size class时compact时,视图控制器垂直组织它的内容。
图1-4调整views以适应size class 的改变
在一个给定的size class内,在任何时候发生更细粒度大小的改变都是可能的。当用户从肖像画到风景画旋转iPhone时,size class可能不会改变,但是屏幕尺寸通常都会改变。当你使用自动布局时,UIKit自动调整视图的大小和位置用来适应新的屏幕尺寸。视图控制器可以根据需要做出额外的调整。更多关于自适应性的信息,see The Adaptive Model.
翻译自:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/index.html#//apple_ref/doc/uid/TP40007457-CH2-SW1