首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》6.6 加载和显示视图

关灯直达底部

现在HypnoNerd应用中有两个视图控制器,这种情况下之前介绍的视图延迟加载机制显得尤为重要。当应用启动后,标签栏会默认显示第一个视图控制器的视图,这时第二个视图控制器的视图不需要显示,只有当用户点击了第二个视图控制器的标签项,才显示相应的视图。

可以使用视图控制器的viewDidLoad方法检查视图控制器的视图是否已经加载,每个UIViewController对象都实现了viewDidLoad方法,该方法会在载入视图后立刻被调用。

在BNRHypnosisViewController.m中覆盖viewDidLoad方法,向控制台输出一条提示信息,代码如下:

- (void)viewDidLoad

{

// 必须调用父类的viewDidLoad

[super viewDidLoad];

NSLog(@"BNRHypnosisViewController loaded its view.");

}

同样,在BNRReminderViewController.m中覆盖viewDidLoad方法,代码如下:

- (void)viewDidLoad

{

[super viewDidLoad];

NSLog(@"BNRReminderViewController loaded its view.");

}

构建并运行应用,控制台应该会输出BNRHypnosisViewController对象载入其视图的提示信息。单击对应BNRReminderViewController对象的标签项,控制台才会输出该对象载入其视图的提示信息。现在两个视图控制器的视图都已加载完毕,继续切换标签项不会再次触发视图控制器的viewDidLoad方法,所以控制台不会再有任何输出(请读者尝试并检查结果)。

为了实现视图延迟加载,在initWithNibName:bundle:中不应该访问view或view的任何子视图。凡是和view或view的子视图有关的初始化代码,都应该在viewDidLoad方法中实现,避免加载不需要在屏幕上显示的视图。

访问视图

通常情况下,在用户看到XIB文件中创建的视图之前需要对它们做一些额外的初始化工作。但是,关于视图的初始化代码不能写在视图控制器的初始化方法中——此时视图控制器并未加载NIB文件,所有指向视图的属性都是nil。如果向这些属性发送消息,虽然编译时不会报错,但是运行时无法对这些属性做任何操作。

那么,应该在哪个方法中访问XIB文件中的视图呢?主要包括两个方法,可以根据实际需要选择。第一个方法是用于确认视图已经加载的viewDidLoad,该方法会在视图控制器加载完NIB文件之后被调用,此时视图控制器中所有视图属性都已经指向了正确的视图对象。第二个方法是viewWillAppear:,该方法会在视图控制器的view添加到应用窗口之前被调用。

两个方法的区别是,如果只需要在应用启动后设置一次视图对象,就选择viewDidLoad;如果用户每次看到视图控制器的view时都需要对其进行设置,则选择viewWillAppear:。

BNRReminderViewController的view有一个子视图datePicker,在用户看到该子视图之前需要对其做额外设置。目前,用户可以选择一个已经过去的时间作为提醒时间,因此需要设置datePicker,只允许用户选择一个距离现在至少60秒以后的时间。

因为用户每次看到BNRReminderViewController的view时都更新datePicker,所以应该覆盖viewWillAppear:。打开BNRReminderViewController.m,在viewWillAppear:中设置datePicker的minimumDate属性(可供选择的最小时间)。

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

self.datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:60];

}

构建并运行应用,选择Reminder标签项,现在用户只能选择一个未来时间了。

相反,如果覆盖的是viewDidLoad而不是viewWillAppear:,则BNRReminderView- Controller只会在用户第一次看到datePicker时设置minimumDate,之后在应用运行的过程中,minimumDate属性会保持不变。随着应用运行时间越来越长,用户很快就能够选择已经过去的时间。

viewWillAppear方法中的animated参数用于设置是否使用视图显示或消失的过渡动画。UITabBarController不会显示过渡动画,第10章中将会介绍UINavigation- Controller,它会在视图控制器被推入和推出屏幕时使用过渡动画。