【iOS】视图控制器编程指南View Controller Programming Guide for iOS

版权声明:本文为博主原创,如需转载请注明出处。

官方文档地址

OverView 简介

The Role of View Controllers - 视图控制器的作用

视图控制器是应用程序的内部结构的基础。每个应用程序都至少有一个视图控制器,并且大多数的应用程序有几个。每个视图控制器管理应用程序用户界面的一部分以及接口和底层数据之间的交互。视图控制器也便于用户界面的不同部分之间的转换。

因为他们在你的应用程序中扮演着重要的角色,视图控制器几乎在你所做的一切的中心。UIViewController 类定义的方法和属性来管理您的视图,处理事件,从一个视图控制器转换到另一个,并协调您的应用程序的其他部分。创建一个UIViewController 的子类并添加你需要实现你的应用程序行为的自定义代码。

有两种类型的视图控制器:

  • Content 视图控制器管理一些软件内容的离散部分,并且是你创建试图控制器的主要类型
  • Container 视图控制器收集来自其他视图控制器信息(称为子视图控制器 ),并以便于导航或呈现不同视图控制器的内容的方式来呈现它。

View Management - 视图管理

视图控制器的最重要的作用是管理视图的层次。每个视图控制器有一个包含所有视图控制器的内容的单根视图。对于根视图,您可以添加你需要显示内容的 views 。如图1-1所示视图控制器和视图之间的内置关系。视图控制器总是有它的根视图的引用,每个视图都有其子视图强引用。

![Figure 1-1Relationship between a view controller and its views](http://ww1.sinaimg.cn/mw690/a9c4d5f6gw1f6vkjxe3eij20qe0i774c.jpg)

Note: It is common practice to use outlets to access other views in your view controller’s view hierarchy. Because a view controller manages the content of all its views, outlets let you store references to the views that you need. The outlets themselves are connected to the actual view objects automatically when the views are loaded from the storyboard.

一个内容视图控制器通过自身管理所有的视图。容器视图控制器管理自己的视图以及它的一个或多个子视图控制器的根视图。容器不能管理其子女的内容。它只能管理根视图,根据容器的设计调整大小和位置。图1-2说明了一个拆分视图控制器及其子女的关系。拆分视图控制器管理的总体尺寸和其子视图的位置,但是子视图控制器管理这些视图的实际内容。

![Figure 1-2View controllers can manage content from other view controllers](http://ww2.sinaimg.cn/mw690/a9c4d5f6gw1f6vljhj6yvj20ts0u0t8x.jpg)

有关管理视图控制器的视图的信息,请参阅 Managing View Layout.

Data Marshaling - 数据编排

视图控制器作为其管理的视图和您的应用程序的数据之间的中介。UIViewController 类的方法和属性,让你管理你的应用程序的视觉呈现。当你创建一个 UIViewController 的子类。您可以添加您需要在子类来管理您的数据的任何变量。添加自定义变量,创建像在图1-3的关系,在视图控制器将数据和用于提供该数据。 两者之间移动数据来回是你的责任。

![图1-3视图控制器的数据对象和视图之间起中介作用](http://ww4.sinaimg.cn/mw690/a9c4d5f6gw1f6vm04ft6bj20i30bzt8y.jpg)

你应该总是你的视图控制器和数据对象内维持职责完全分离。大多数用于确保数据结构的完整性的逻辑所属的数据对象本身。 视图控制器可以验证从输入的意见来,然后打包你的数据对象要求的格式该输入,但你应该尽量减少视图控制器在管理中的实际数据的作用。

一个 UIDocument 目的是从您的视图控制器分别管理自己的数据的一种方法。 文档对象是一个知道如何读取和写入数据,永久存储控制器对象。 当你继承,您可以添加任何逻辑和方法,你需要提取数据,并将其传递给视图控制器或您的应用程序的其他部分。 视图控制器可以存储接收,使其更容易地更新视图的任何数据的副本,但文件仍拥有真正的数据。

User Interactions - 用户交互

视图控制器是响应者对象 ,并能够处理回落响应链事件。 虽然他们有能力这样做,视图控制器很少直接处理触摸事件。 相反,通常视图处理自己的触摸事件并把结果汇报到相关委托或目标对象的方法,它通常是视图控制器。 因此,在视图控制器大多数事件是使用委托方法或 action methods.

有关在您的视图控制器实施行动方法的详细信息,请参阅 Handling User Interactions. 有关处理其他类型的事件的信息,请参阅 Event Handling Guide for iOS

Resource Management - 资源管理

视图控制器承担自己的视图,它创建的任何对象的所有责任。 在UIViewController类自动处理视图管理的大多数方面。 例如,UIKit会自动释放那些不再需要的任何视图相关的资源。 在你 UIViewController 子类,你负责管理明确是你创建的任何对象。

当可用内存不足时,UIKit的应用要求释放他们不再需要任何资源。 它这样做的一种方法是通过调用您的视图控制器的方法 didReceiveMemoryWarning。 使用该方法来消除,你不再需要或以后就能很容易重新创建对象的引用。 例如,您可以使用该方法来删除缓存数据。 你可以当内存不足情况发生时释放尽可能多的内存是非常重要的。 消耗太多内存的应用可能会直接被系统终止,恢复内存。

Adaptivity - 适应性

视图控制器负责的视图的展示,并适应该视图底层环境相匹配。 每一个iOS应用程序应该能够在iPad上,并在几个不同尺寸的iPhone上运行。 而不是为每个设备提供不同的视图控制器和视图层次,它更易于使用,能够适应其观点不断变化的空间需求的单一视图控制器。

在iOS系统中,视图控制器需要处理粗粒度的变化和细粒度的变化。 当一个视图控制器的 traits 发生改变粗粒度的变化发生。 性状是描述整体环境,诸如显示刻度属性。 最重要的特征之一是两个视图控制器的水平和垂直尺寸,这表明视图控制器在给定尺寸的空间有多大。 您可以使用尺寸级别的变化而改变视图的布局, 如图1-4所示 。 当水平尺寸类是regular ,视图控制器利用额外的水平空间来安排内容。 当水平尺寸级别紧凑 ,视图控制器垂直排列其内容。

![图1-4适应视图大小变化级](http://ww2.sinaimg.cn/mw690/a9c4d5f6gw1f6vmodoektj20ov0gvmx7.jpg)

在一个给定的大小类,有可能在任何时候发生更细粒度大小的变化。当用户旋转iPhone从纵向到横向,大小类可能不会改变,但屏幕尺寸通常改变。当你使用自动布局,UIKit自动调整视图的大小和位置来匹配新的维度。根据需要视图控制器可以做出更多的调整。

有关自适应的详细信息,请参阅The Adaptive Model.

The View Controller Hierarchy - 视图控制器层次

您的应用程序的视图控制器之间的关系定义每个视图控制器所需的行为。 UIKit的希望您能在规定的方式使用视图控制器。 保持适当的视图控制器的关系,确保自动行为传递到正确的视图控制器在需要的时候。 如果你违反了规定的遏制和演示的关系,你的应用程序的某些部分停止的行为预期。

根视图控制器

根视图控制器是视图控制器层次结构的锚。 每个窗口都只有其内容填充该窗口一个根视图控制器。 根视图控制器定义了用户看到的初始内容。 如图2-1所示根视图控制器和窗口之间的关系。 因为窗口有没有自己的可视内容,视图控制器的视图提供的所有内容。

![](http://ww3.sinaimg.cn/mw690/a9c4d5f6gw1f6vmznbodyj20p40gb0ss.jpg)

编程设置一个根视图是UITableView的app

1
2
3
4
5
#import <UIKit/UIKit.h>

@interface HomePageViewController : UITableViewController

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import "HomePageViewController.h"

@interface HomePageViewController ()

@end

@implementation HomePageViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}




@end
1
2
3
@interface AppDelegate ()

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

UITableViewController *homePageController = [[HomePageViewController alloc] init];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = homePageController;

[self.window makeKeyAndVisible];

return YES;
}
@end

Container View Controllers - 容器视图控制器

UIKit 有3个容器视图控制器UINavigationController, UISplitViewController, and UIPageViewController.

![](http://ww1.sinaimg.cn/mw690/a9c4d5f6gw1f6vn7blcwdj20wd0podga.jpg)
![](http://ww3.sinaimg.cn/mw690/a9c4d5f6gw1f6vn9s627wj20qn0vpmxk.jpg)
![](http://ww2.sinaimg.cn/mw690/a9c4d5f6gw1f6vnd49ituj20u50v5t95.jpg)

Design Tips - 设计技巧

Use System-Supplied View Controllers Whenever Possible - 尽可能使用系统提供的视图控制器

UIImagePickerController UIKit中类显示捕获的图片和视频,并访问用户的相机胶卷的标准接口。

你创建自己的自定义视图控制器之前,看一下现有的框架,看是否有视图控制器已经存在,您要执行的任务。

  • UIKit框架提供的视图控制器显示警报,拍照和视频,以及在iCloud上管理文件。UIKit中还定义了你可以用它来组织你的内容许多标准容器视图控制器。
  • 该框架的GameKit提供的视图控制器匹配的玩家和管理排行榜,成就和其他游戏功能。
  • 地址簿UI框架提供的视图控制器用于显示和采摘的联系信息。
  • 在MediaPlayer框架提供视图控制器用于播放和管理视频,以及用于从用户的库中选择媒体资产。
  • 该EventKit UI框架提供的视图控制器用于显示和编辑用户的日历数据。
  • 该GLKit框架提供用于管理OpenGL渲染表面的视图控制器。
  • 该Multipeer连接框架提供的视图控制器用于检测其他用户,并邀请他们来连接。
  • 消息UI框架提供的视图控制器用于撰写电子邮件和短信。
  • 该PassKit框架提供的视图控制器显示通行证,并将它们添加到存折。
  • 社交框架提供的视图控制器用于撰写消息的Twitter,Facebook和其他社交媒体网站。
  • 该AVFoundation框架提供用于显示媒体资产视图控制器。

注意:切勿改装系统提供的视图控制器的视图层次结构。 每个视图控制器拥有自己的视图层次和负责维护该层次结构的完整性。 进行更改可能会引入错误到你的代码或防止所属视图控制器正确操作。 在系统视图控制器的情况下,始终依靠视图控制器的公开可用的方法和属性,使所有修改。

View Controller Definition

Defining Your Subclass

  • 使用UITableViewController特别是当你的视图控制器的主视图是一个表。
  • 使用UICollectionViewController特别是当你的视图控制器的主视图是一个集合视图。
  • 使用UIViewController 对于所有其他视图控制器。

定义UI

用户界面触摸

outlets

在运行时展示 view

  1. Instantiates views using the information in your storyboard file.
  2. Connects all outlets and actions.
  3. Assigns the root view to the view controller’s view property.
  4. Calls the view controller’s awakeFromNib method.When this method is called, the view controller’s trait collection is empty and views may not be in their final positions.
  5. Calls the view controller’s viewDidLoad method.
  6. Use this method to add or remove views, modify layout constraints, and load data for your views.

管理 view 布局

高效管理内存

新博客文章地址:
CSDN文章地址: