由于应用已经启用了状态恢复,因此应用的生命周期多出了一环——应用启动后首先会判断是否需要恢复应用状态,如图24-3所示。目前创建UIWindow对象和rootViewController的代码都位于application:didFinishLaunchingWithOptions:方法中,需要针对状态恢复修改代码。
图24-3 启用状态恢复后的生命周期
application:willFinishLaunchingWithOptions:方法会在系统恢复应用状态之前调用。因此,需要在状态恢复触发之前执行的代码都应该写在该方法中,例如创建并设置UIWindow对象。
在BNRAppDelegate.m中覆盖该方法,创建并设置UIWindow对象,代码如下:
- (BOOL)application:(UIApplication *)application
willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window =
[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
return YES;
}
然后更新application:didFinishLaunchingWithOptions:方法,如果应用没有触发状态恢复(例如,应用第一次启动时),就需要创建并设置应用的各个视图控制器。同时,创建并设置UIWindow对象的代码已经移动到了application: willFinishLaunching- WithOptions:中,因此要删除application: didFinishLaunchingWithOptions:中的相关代码:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window =
[[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]];
// 如果应用没有触发状态恢复,就创建并设置各个视图控制器
if (!self.window.rootViewController) {
BNRItemsViewController *itemsViewController =
[[BNRItemsViewController alloc] init];
// 创建一个UINavigationController对象,
// 其根视图控制器是itemsViewController
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:itemsViewController];
// 将UINavigationController对象的类名设置为恢复标识
navController.restorationIdentifier =
NSStringFromClass([navController class]);
// 将UINavigationController对象设置为UIWindow的rootViewController
self.window.rootViewController = navController;
}
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}