ViewController的使用技巧

前言
为什么翻译这系列文章
概述
ViewController是App在iOS系统上运行的必须工具,也是UIKit框架的基础组件,使用它可以不用写太多代码就能构建出复杂的用户界面。当你实现自己的ViewController的时候,使用下面的提示和规范能帮助你避免做出违反系统不期望的行为。
尽量使用系统支持的ViewController
许多iOS框架定义了ViewController,你可以在自己的App中使用这些ViewController。使用系统提供的ViewController可以节省你的开发时间,并且对用户而言,也是一种很舒适的体验。
大多数系统的ViewController使用实现特定功能的。比如有些ViewController用来访问用户数据如通讯录、有些ViewController提供访问硬件的功能、有些ViewController提供访问多媒体的功能,比如说UIKit框架中的UIImagePickerController类可以访问用户的相册,来展示一个标准的图片或者视频交互界面。
在创建自己的ViewController之前,先确定一下现有的框架中是否包含ViewController可以用完成你的开发任务。

  • UIKit框架提供了弹出框、调用相机和视频、管理iCoud上的文件等类型的ViewController。UIKit框架中还提供了许多容器类型的ViewController,你可以使用他们来组织你的内容
  • Gamekit框架提供了玩家匹配、排行榜、成就和其他具有游戏特性的ViewController。
  • Address Book UI 框架提供了展示和选择联系人的ViewController。
  • MediaPlayer框架提供了播放和管理视频的ViewController,还有选择媒体资源的ViewController。
  • EnventKit框架提供了展示和编辑用户日历的的ViewController。
  • GLkit框架提供了管理OpenGL渲染曲面的ViewController。
  • Multipeer Connectivity框架提供了检测其他用户并邀请他们连接的ViewController。
  • Message UI框架提供了构成电子邮件和短信的ViewController。
  • PassKit框架提供了展示凭证和将凭证添加到存折的ViewController。
  • Social框架提供了向Twitter、facebook和其他社会化媒体网站分享信息的UI。
  • AVFoundation框架提供了展示媒体资源的ViewController。
注意:不要去视图修改系统提供的ViewController的视图层级结构。每个ViewController有其自己的视图层级结构,并负责维持其层级结构的完整性。进行修改可能引发bug或者不能正确的显示ViewController。在有些系统提供的ViewController中,可以依据其提供的公开方法或者属性来做响应的修改。
关于更多特定功能的ViewController,请参考相应框架的参考文档。
保证ViewController之间的隔离
ViewController应当是自足型对象。没有ViewController可以了解到另一个ViewController的内部工作和它的视图层级。当两个ViewController需要通信或者传递数据的时候,应该使用它们给定的公共接口。
代理模式在管理两个ViewController之间通信的时候经常用到。在代理模式下,一个ViewController定义与相关交互代理对象相关协议,代理对象实现这个协议。代理对象的类型不需要确切的类型,重要的是它实现了协议方法。
将ViewController的根视图作为其他视图的容器
使用ViewController的根视图最为其他内容的容器。使用根视图作为容器可以给其他所有的View一个公共的父视图,这使得许多布局操作变得非常简单。许多自动布局约束需要共同的父视图来设置视图的属性。
了解数据的流向
在模型-视图-控制器的设计模式下,ViewController的角色是促进数据在模型对象和视图对象之间流动。ViewController可能在临时变量中存储一些数据,并且执行一些校验,但是ViewController的主要职责是确保视图的包含准确的信息。数据对象的责任在于管理真实的数据和确保数据的完整性。
视图和数据分离的一个例子是,UIDocument类与UIViewController类的关系。这两个类默认没有任何关系。一个UIDocument对象作用是加载和报错数据,而UIViewController的作用是将视图展示的屏幕上。如果你要使用这两个对象,需要注意的是,ViewController只需要从document对象中获取有效的对象即可。真实的数据仍然属于document对象。
适应屏幕的变化
Apps可以运行在不同的iOS设备上,并且ViewController设计的时候已经适配了不同尺寸的屏幕。不需要在不同的设备上使用不同ViewController,而是使用ViewController内置的适配器去适配不同的尺寸和尺寸的变化。UIKit发送的通知让您有机会对用户界面进行大规模和小规模的更改,而无需更改视图控制器代码的其余部分。
【ViewController的使用技巧】关于更多屏幕适配的信息,请参考The Adaptive Model。

    推荐阅读