恢復現場的涵義是當前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地址