翻译:iOS视图控制器编程指南(三)——设计技巧(Design
视图控制器是iOS中运行应用的一个重要工具,使用UIKit可以很容易创建复杂的接口而不用编写大量的代码。当实现你自己的视图控制器,使用下面的建议和指南来确保你不会做干扰系统期望的行为。
尽量使用系统提供的视图控制器
许多iOS框架定义可以在应用中使用的视图控制器。使用这些系统提供的视图控制器可以为你节省时间,确保一致的用户体验。
大多数系统视图控制器为特定任务而设计的。一些视图控制器可以访问用户数据例如联系人。其他视图控制器可以访问硬件或提供特殊界面来管理媒体。例如,UIKit中的UIImagePickerController类显示一个标准接口,用于捕获图片和适配并访问用户的相机。
在你创建自定义视图控制器之前,查看现有框架看看是否存在一个视图控制器可以完成你想要执行的任务。
·UIKit框架提供了视图控制器来显示警告、拍照和拍适配,管理iCloud中的文件。UIKit也定义了许多标准容日视图控制器,你可以使用它们在组织你的内容。
·GameKit框架提供视图控制器用于管理玩家、排行榜、成就和其他游戏功能。
·地址簿UI框架提供视图控制器用于显示和选择联系信息。
·MediaPlayer框架提供视图控制器用于显示和管理视频及从用户库中选择媒体资源。
·EventKit UI框架提供视图控制器用于显示和编辑用户的日历数据。
·GLKit框架提供视图控制器用于管理OpenGL渲染界面。
·Multipeer连接框架提供视图控制器用于检测其他用户并邀请他们连接。
·Message UI框架提供视图控制器用于组成电子邮件和短信。
·PassKit框架提供视图控制器用于显示pass及添加pass到Passbook。
·Social框架提供视图控制器用于为Twitter、Facebook和其他社交媒体网站构成消息。
·AVFoundation框架提供视图控制器用于显示媒体资源。
重要:不要修改系统提供的视图控制器的视图层级。每个视图控制器有自己的视图层级并自己负责维护层次结构的完整性。更改视图层级结构可能引入bug到你的代码并阻止视图控制器的正确操作。在系统视图控制器的情况下,要依靠公开的方法和属性修改视图控制器。
更多关于使用特殊视图控制器的信息,参见相应的框架文档。
让每个视图控制器相互独立
视图控制器应该是独立的对象。视图控制器不需要了解另一个视图控制器的内部运作或视图层级结构。在这种情况下,两个视图控制器需要通信或来回传递数据,使用显式定义的公共接口来完成通信或传递数据。
delegation设计模式通常用于管理视图控制器之间的通信。有了代理,一个对象定义一个protocol用于与相关代理对象通信,该代理对象符合该协议。委托对象的确切类型不重要。重要的是它实现了协议的方法。
使用根视图仅作为其他视图的容器
使用视图控制器的根视图仅仅作为内容的容器。使用根视图作为一个容器让所有的视图都有一个公共的父视图,这样使布局操作更简单。许多自动布局约束要求一个公共的父视图来保证视图布局的正确性。
知道你的数据在哪里
在MVC设计模式中,一个视图控制器的作用是促进模型对象和视图对象之间的数据移动。视图控制器可能存储一些临时变量数据并执行验证,但它的主要责任是确保其视图包含准确的信息。数据对象是负责管理实际数据并确保数据整体完整性。
在UIDocument和UIDocument类之间关系分离数据和界面的例子。具体来说,两者之间没有默认关系。UIDocument对象协调数据的加载和保存,而UIViewController对象协调视图在屏幕上显示。如果你创建两个对象间的关系,请记住,为了效率,视图控制器应该只缓存来自文档的数据。实际的数据仍然属于文档对象。
自适应变更
应用可以在各种各样的iOS设备上运行,视图控制器的设计师为了适应不同大小设备的屏幕。而不是使用单独的视图控制器来管理不同的屏幕,使用内置的自适应支持响应视图控制器的大小和size类的变更。UIKit发送的通知让你可以大规模或小规模的更改你的用户界面,而无需改变视图控制器的其余代码。
关于处理自适应变化的更多信息,参见自适应模型(The Adaptive Model)