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

《iOS编程(第4版)》28.7 深入学习:状态恢复

关灯直达底部

本书第24章介绍了在不使用Storyboards的情况下恢复应用状态,本章介绍如何通过storyboard文件实现状态恢复。

如果在Storyboards中使用状态恢复系统,可以避免编写大量样板代码(boilerplate code)。例如,视图控制器的恢复标识可以直接在Storyboard文件中设置。通常可以将视图控制器的Storyboard标识作为恢复标识,如图28-22所示。

图28-22 Storyboard标识与恢复标识

首先,如果要启用状态恢复,同样要在应用委托中实现保存和恢复应用状态的两个委托方法:

@implementation BNRAppDelegate

- (BOOL)application:(UIApplication *)application

shouldSaveApplicationState:(NSCoder *)coder

{

return YES;

}

- (BOOL)application:(UIApplication *)application

shouldRestoreApplicationState:(NSCoder *)coder

{

return YES;

}

接下来同样需要使UIViewController子类遵守UIViewControllerRestoration协议,并实现协议中的方法,返回相应的UIViewController子类对象。区别是,在Storyboards中,需要通过Storyboard文件实例化UIViewController子类,代码如下:

+ (UIViewController *)

viewControllerWithRestorationIdentifierPath:(NSArray *)path

coder:(NSCoder *)coder

{

BNRColorViewController *vc = nil;

UIStoryboard *storyboard = [coder decodeObjectForKey:

UIStateRestorationViewControllerStoryboardKey];

if (storyboard)

{

vc = (BNRColorViewController *)[storyboard

instantiateViewControllerWithIdentifier:

@“BNRColorViewController”];

vc.restorationIdentifier = [identifierComponents lastObject];

vc.restorationClass = [BNRColorViewController class];

}

return vc;

}

NSCoder对象编码了包含视图控制器的Storyboard文件,可以通过UIStateRestorationViewControllerStoryboardKey对Storyboard文件解码,得到UIStoryboard对象。UIStoryboard提供了instantiateViewControllerWithIdentifier:方法,可以根据Storyboard标识创建相应的视图控制器。

除此之外,实现状态恢复的其余代码都是相同的。如果视图控制器要保存和恢复状态信息,同样要实现encodeRestorableStateWithCoder:和decodeRestorableStateWithCoder:方法。