本书第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:方法。