视图控制器是运行在iOS上的应用程序的必要工具,UIKit的视图控制器基础设施使得创建复杂的界面而不需要编写大量代码变得容易。 当实现你自己的视图控制器时,请使用以下提示和指南,以确保你不会做可能干扰系统预期的自然行为的事情。
只要可能,请使用系统提供的视图控制器
许多iOS框架定义视图控制器,你可以在你的应用程序中使用。 使用这些系统提供的视图控制器可为您节省时间,并确保为用户提供一致的体验。
大多数系统视图控制器是为特定任务设计的。 一些视图控制器提供对诸如联系人的用户数据的访问。 其他人可能提供访问硬件或提供专门调整的界面来管理媒体。 例如,UIKit中的UIImagePickerController类显示用于捕获图片和视频以及用于访问用户的相机胶卷的标准界面。
在创建自己的自定义视图控制器之前,请查看现有框架,以查看是否已存在要执行的任务的视图控制器。
- UIKit框架提供视图控制器,用于显示警报,拍摄照片和视频,以及在iCloud上管理文件。 UIKit还定义了许多标准容器视图控制器,您可以使用它们来组织内容。
- GameKit框架提供了用于匹配玩家和用于管理排行榜,成就和其他游戏功能的视图控制器。
地址簿UI框架提供用于显示和选择联系人信息的视图控制器。 - MediaPlayer框架提供了视图控制器,用于播放和管理视频,以及从用户库中选择媒体资产。
- EventKit UI框架提供了用于显示和编辑用户日历数据的视图控制器。
- GLKit框架提供了一个用于管理OpenGL渲染表面的视图控制器。
- Multipeer连接框架提供视图控制器,用于检测其他用户并邀请他们连接。
- 消息UI框架提供用于撰写电子邮件和SMS消息的视图控制器。
- PassKit框架提供了视图控制器来显示通行证并将它们添加到Passbook。
- 社交框架提供了用于撰写Twitter,Facebook和其他社交媒体网站的消息的视图控制器。
- AVFoundation框架提供用于显示媒体资产的视图控制器。
重要
切勿修改系统提供的视图控制器的视图层次结构。 每个视图控制器拥有
其视图层次结构,并负责维护该层次结构的完整性。 进行更改可能会在
代码中引入错误或阻止拥有视图控制器正常运行。 在系统视图控制器的
情况下,总是依靠视图控制器的公开可用的方法和属性来进行所有修
改。
使每个视图控制器成为独立的岛屿
视图控制器应该始终是自包含的对象。 没有视图控制器应该知道另一个视图控制器的内部工作原理或视图层次结构。 在两个视图控制器需要来回通信或传递数据的情况下,它们应该总是使用明确定义的公共接口来这样做。
委派设计模式经常用于管理视图控制器之间的通信。 通过委托,一个对象定义用于与相关联的委托对象通信的协议,该委托对象是符合协议的任何对象。 委托对象的确切类型不重要。 所有重要的是它实现协议的方法。
使用根视图作为其他视图的容器
将视图控制器的根视图仅用作其余内容的容器。 使用根视图作为容器给你的所有视图一个共同的父视图,这使得许多布局操作更简单。 许多自动布局约束需要通用的父视图来正确布置视图。
知道你的数据在哪里
在模型 - 视图 - 控制器设计模式中,视图控制器的角色是便于在模型对象和视图对象之间移动数据。 视图控制器可以在临时变量中存储一些数据并执行一些验证,但它的主要职责是确保其视图包含准确的信息。 您的数据对象负责管理实际数据并确保数据的整体完整性。
在UIDocument和UIViewController类之间的关系中存在数据和界面的分离的示例。 具体来说,两者之间不存在默认关系。 UIDocument对象协调加载和保存数据,而UIViewController对象协调屏幕上的视图显示。 如果您在两个对象之间创建关系,请记住,视图控制器应该只缓存文档中的信息以提高效率。 实际数据仍然属于文档对象。
屏幕适配更改
应用程序可以在各种iOS设备上运行,而视图控制器设计为适应这些设备上不同大小的屏幕。 不要使用单独的视图控制器来管理不同屏幕上的内容,请使用内置的自适应支持来响应视图控制器中的大小和大小类更改。 UIKit发送的通知为您提供了对用户界面进行大规模和小规模更改的机会,而无需更改其余的视图控制器代码。