恢复现场的涵义是当前app在A页面被系统杀死后,下次进入app仍然进入页面A。git
这个操做有三个关键的步骤:github
- 获取当前视图,保存视图必需要的属性。
- 将上述内容在必要的时保存在本地以及删除。
- 在进入app时读取内容,生成视图并为之赋值。
得到当前视图 个人方案是给appdelegate写了一个方法用于使用,代码以下:app
- (UIViewController *)getVisableVC
{
UIViewController * vc = self.window.rootViewController;
while ([vc isKindOfClass:[UITabBarController class]]) {
vc = ((UITabBarController *)vc).selectedViewController;
}
while ([vc isKindOfClass:[UINavigationController class]]) {
vc = ((UINavigationController *)vc).visibleViewController;
}
while (vc.presentedViewController) {
vc = vc.presentedViewController;
}
return vc;
}
复制代码
得到当前视图的必要属性**(注意这里须要存储额外的类名,便于后续生成实例)** 个人方案是给UIViewController添加了一个类方法用于实现,返回必要的属性名(而后利用kvc)。实际使用以下:spa
#pragma mark 恢复现场
+ (NSArray *)restoreSceneKey
{
return @[@"comic_id",@"comicName"];
}
复制代码
什么时候触发存储操做rest
思路1:在系统杀死程序时存储——Pass(咱们没法在程序被系统杀死得到消息) 思路2:在系统进入后台时存储内容——winner(迂回路线,实现需求)code
什么时候触发删除操做get
- 在进入app得去本地内容跳转到须要恢复的视图后删除
- 配合思路二,在获得程序被认为杀死的消息时删除
PS:至于存储方式,我采用的是plist本地文件存储it
生成视图 利用解决问题1时存下的类名生成对应的实例。io
为之赋值ast
- 利用kvc为之赋值
- 利用runtime为之赋值
在demo中我采用的是利用runtime为之赋值,kvc的方式没有实践过,此处就留个读者本身拓展实现了
在Demo中我采用的存储方式是plist文件形式存储,为视图赋值采用的是runtime形式,并在其中添加了健壮性检测,防止本地文件被修改后致使的错误 Demo地址