[TOC=5]
* * * * *
>原文链接 :[Design Tips](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DesignTips.html#//apple_ref/doc/uid/TP40007457-CH5-SW1)
视图控制器是运行在iOS上的应用程序的基本工具,而UIKit的视图控制器基础设施使得创建复杂的界面变得简单,而无需编写大量代码。在实现您自己的视图控制器时,使用下面的技巧和指导方针,以确保您不会做可能会干扰系统预期的行为的事情。
### 尽量使用系统提供的视图控制器
许多 iOS 框架定义了视图控制器,你可以在你的应用中使用它。使用这些系统提供的视图控制器为您节省了时间,并确保了用户的一致体验。
大多数系统视图控制器都是针对特定任务设计的。一些视图控制器提供对用户数据的访问,例如联系人。其他人可能提供对硬件的访问,或者为管理媒体提供经过特殊调整的接口。例如,UIKit 中的 UIImagePickerController 类会显示一个标准的接口,用于捕捉图像和视频,以及用于访问用户的相册。
在创建您自己的自定义视图控制器之前,先看一下现有的框架,看看是否已经存在您想要执行的任务的视图控制器。
* UIKit 框架提供了视图控制器,用于显示警报、拍照和视频,以及管理 iCloud上 的文件。UIKit 还定义了许多标准的容器视图控制器,你可以用它们来组织你的内容。
* GameKit 框架为匹配的玩家提供了视图控制器,并为管理排行榜、成就和其他游戏特性提供了支持。
* Address Book UI 框架提供了用于显示和选择联系信息的视图控制器。
* MediaPlayer 框架提供了用于播放和管理视频的视图控制器,以及从用户的库中选择媒体资源。
* EventKit UI 框架提供了用于显示和编辑用户日历数据的视图控制器。
* GLKit 框架提供了一个用于管理 OpenGL 渲染的视图控制器。
* Multipeer Connectivity 提供了用于检测其他用户的视图控制器,并邀请它们进行连接。
* Message UI 提供了用于编写电子邮件和 SMS 消息的视图控制器。
* PassKit 框架提供视图控制器来显示通行证并将其添加到存折。
* Social 框架为 Twitter、Facebook 和其他社交媒体网站提供了视图控制器。
* AVFoundation 框架提供了一个用于显示媒体资源的视图控制器。
> 重要提示
> 永远不要修改系统提供的视图控制器的视图层次结构。每个视图控制器都拥有它的视图层次结构,负责维护该层次结构的完整性。否则可能会在代码中引入错误,或者使该视图控制器运行出错。使用视图控制器的公开可用的方法和属性来进行所有的修改。
有关使用特定视图控制器的信息,请参阅对应框架的参考文档。
### 保持每个视图控制器的独立性
视图控制器应该始终是独立的对象。任何视图控制器都不应该知道另一个视图控制器的内部工作或视图层次结构。在两个视图控制器需要通信或来回传递数据的情况下,它们应该总是使用公开定义的公共接口。
委托设计模式经常用于管理视图控制器之间的通信。委托,定义了一个用于与委托对象进行通信的协议,该对象可以是任何遵守协议的对象。委托对象的确切类型并不重要。重要的是它实现了协议的方法。
### 仅将根视图用作其他视图的容器
仅将视图控制器的根视图用作其他内容的容器。使用根视图作为一个容器,可以让所有视图都有一个通用的父视图,这使得许多布局操作更加简单。许多自动布局约束需要一个公共的父视图来正确地布局视图。
### 知道你的数据在哪里
在 [model-view-controller](https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html#//apple_ref/doc/uid/TP40008195-CH32) 设计模式中,视图控制器的作用是促进模型对象和视图对象之间数据的传递。视图控制器可能会在临时变量中存储一些数据并执行一些验证,但是它的主要职责是确保其视图包含准确的信息。您的数据对象负责管理实际的数据,并确保数据的整体完整性。
在 UIDocument 和 UIViewController 类之间的关系中存在数据和接口的分离的例子。具体来说,两者之间不存在默认的关系。一个 UIDocument 对象协调数据的加载和保存,而一个 UIViewController 对象在屏幕上协调视图的显示。如果您在这两个对象之间创建了一个关系,请记住,视图控制器从文档中缓存信息应该只为获得效率。实际的数据仍然属于 UIDocument 对象。
### 适应变化
应用可以在多种iOS设备上运行,而视图控制器的设计是为了适应这些设备上不同大小的屏幕。不要使用单独的视图控制器来管理不同屏幕上的内容,而是使用内置的适应性支持来响应视图控制器中的 size and size class 变化。UIKit发出的通知让你有机会对用户界面进行大规模和小规模的更改,而无需更改视图控制器代码的其余部分。
有关处理自适应变化的更多信息,请参 [The Adaptive Model](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html#//apple_ref/doc/uid/TP40007457-CH19-SW1) 。