View Controller Programming Guide for iOS(1) - Design Tips

View Controller 可以说是整个 UIKit 框架的基础,它让整个应用界面的构建变得更加容易,也为程序员缩减了代码量。如果您在自定义 View Controller 的时候,能够遵循之后列出的几条小规则,那么必将对您的应用有所帮助,使其的运行更加自然,与更符合系统的期望。

Use System-Supplied View Controllers Whenever Possible

很多的 iOS 框架为我们定义了诸多不同的 View Controller,我们可以直接用在开发的应用中。使用系统提供的 View Controller 不仅能节省开发的时间,同时也能为使用者提供一致的用户体验。

大部分系统提供的 View Controller 是为了满足特定的需求。有些可能是为了能够访问用户信息,有些可能是为了访问系统硬件,还有一些可能是为了提供多媒体播放的支持。

在着手创建自定义的 View Controller 前,最好能够先确定一下,已有的系统 View Controller 是否能够满足你的需求:

  • UIKit 框架为我们提供了显示 alert,拍摄图片/视频,管理 iCloud 相关的 View Controller。同时 UIKit 框架也提供了诸多的容器型 View Controller 供开发者使用。
  • GameKit 框架提供了匹配玩家,管理排名,成就以及其他游戏特效的 View Controller。
  • Address Book UI 框架提供了联系人相关的 View Controller。
  • MediaPlayer 框架提供了多媒体播放,以及从用户库中选取多媒体资源的 View Controller。
  • EventKit 框架提供了显示和编辑用户事项的 View Controller。
  • GLKit 框架提供了用了管理 OpenGL 渲染用户界面的 View Controller。
  • Multipeer UI 框架提供了邀请和管理与其他用户连接的 View Controller。
  • Message UI 框架提供了撰写短信/邮箱的 View Controller。
  • PassKit 框架通过了显示凭证,将其加入 Passbook 的 View Controller。
  • Social 框架提供了撰写 Twitter,Facebook 或者其他社交媒体的 View Controller。
  • AVFoundation 框架提供了用了展示多媒体资源的 View Controller。

Make Each View Controller an Island

应该把每一个 View Controller 当作一个孤岛来看待,它不应该也不需要了解另一个 View Controller 的工作方式或其视图的层级关系。如果两个 View Controller 确实需要进行数据传递或者其他的联系,也应该通过显式声明的公开接口来实现。

代理模式是较为常用的方式之一,一方通过为需要的代理定义一个协议,而谁来遵循该协议就不重要了,应为重要的是代理实现协议中定义的方法。

Use the Root View Only as a Container for Other Views

在较好的情况下,最好能够让 View Controller 的 Root View 始终扮演视图容器的角色。保证 View Controller 各个视图能够拥有一个共同的父视图(Root View)能够为视图布局提供诸多便利。例如,在使用 Auto Layout 的时候,很多约束都要求相关视图能有一个共同的父视图。

Know Where Your Data Lives

model-view-controller(MVC) 设计模式中,View Controller 扮演的角色就是帮助完成 数据模型(model)和视图模型(view)之间的交互。View Controller 可能会把一些数据存储在自己的变量上,或者做一些数据校验的工作,但它的主要职责还是能够保证视图呈现出正确无误的信息内容。数据模型才是那一个应该来存储和处理数据的那一方。

Adapt to Changes

每一个应用都有可能被安装在不同的设备上,View Controller 可以适应不同的屏幕尺寸。相较于根据不同的屏幕尺寸来创建不同的 View Controller,我们更应该使用内建的适配功能来针对不同的屏幕尺寸和 Size Class 的改变来作出相应。UIKit 会通过发送通知的方式,让编程者有机会在屏幕变大或者变小的时候做出响应,而不需改变 View Controller 中的大部分代码。

参考资料
0%