恢復(fù)現(xiàn)場的涵義是當前app在A頁面被系統(tǒng)殺死后,下次進入app仍然進入頁面A。
實現(xiàn)思路:
這個操作有三個關(guān)鍵的步驟:
- 獲取當前視圖,保存視圖必須要的屬性。
- 將上述內(nèi)容在必要的時保存在本地以及刪除。
- 在進入app時讀取內(nèi)容,生成視圖并為之賦值。
問題1,如何獲得當前視圖以及其對應(yīng)必要屬性
-
獲得當前視圖
我的方案是給appdelegate寫了一個方法用于使用,代碼如下:- (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; } -
獲得當前視圖的必要屬性(注意這里需要存儲額外的類名,便于后續(xù)生成實例)
我的方案是給UIViewController添加了一個類方法用于實現(xiàn),返回必要的屬性名(然后利用kvc)。實際使用如下:#pragma mark 恢復(fù)現(xiàn)場 + (NSArray *)restoreSceneKey { return @[@"comic_id",@"comicName"]; }
問題2,何時存儲或者刪除本地內(nèi)容
-
何時觸發(fā)存儲操作
思路1:在系統(tǒng)殺死程序時存儲——Pass(我們無法在程序被系統(tǒng)殺死獲得消息)
思路2:在系統(tǒng)進入后臺時存儲內(nèi)容——winner(迂回路線,實現(xiàn)需求) -
何時觸發(fā)刪除操作
- 在進入app得去本地內(nèi)容跳轉(zhuǎn)到需要恢復(fù)的視圖后刪除
- 配合思路二,在得到程序被認為殺死的消息時刪除
PS:至于存儲方式,我采用的是plist本地文件存儲
問題3,進入app時生成視圖并為之賦值
生成視圖
利用解決問題1時存下的類名生成對應(yīng)的實例。-
為之賦值
- 利用kvc為之賦值
- 利用runtime為之賦值
在demo中我采用的是利用runtime為之賦值,kvc的方式?jīng)]有實踐過,此處就留個讀者自己拓展實現(xiàn)了
Demo
在Demo中我采用的存儲方式是plist文件形式存儲,為視圖賦值采用的是runtime形式,并在其中添加了健壯性檢測,防止本地文件被修改后導(dǎo)致的錯誤
Demo地址
遭遇的坑
- 思考過不需要視圖實現(xiàn)任何方法,直接用運行時得到所有屬性存儲起來,但是由于無法區(qū)分屬性的私有的還是公開的,如果取屬性會把所有的包括UIView,layer等展示屬性也給存起來,所以作罷
- 使用過讓視圖傳必要屬性的以及其對應(yīng)的值回來,但是Demo中健壯性檢測不太方便做,而且實現(xiàn)層面需要多寫代碼,不合算。仔細考慮了一下kvc就只需要key在用kvc取value就可以了