iOS 恢復現場

恢復現場的涵義是當前app在A頁面被系統殺死後,下次進入app仍然進入頁面A。git


實現思路:

這個操做有三個關鍵的步驟:github

  1. 獲取當前視圖,保存視圖必需要的屬性。
  2. 將上述內容在必要的時保存在本地以及刪除。
  3. 在進入app時讀取內容,生成視圖併爲之賦值。
問題1,如何得到當前視圖以及其對應必要屬性
  • 得到當前視圖 個人方案是給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"];
    }
    複製代碼
問題2,什麼時候存儲或者刪除本地內容
  • 什麼時候觸發存儲操做rest

    思路1:在系統殺死程序時存儲——Pass(咱們沒法在程序被系統殺死得到消息) 思路2:在系統進入後臺時存儲內容——winner(迂迴路線,實現需求)code

  • 什麼時候觸發刪除操做get

    1. 在進入app得去本地內容跳轉到須要恢復的視圖後刪除
    2. 配合思路二,在獲得程序被認爲殺死的消息時刪除

    PS:至於存儲方式,我採用的是plist本地文件存儲it

問題3,進入app時生成視圖併爲之賦值
  • 生成視圖 利用解決問題1時存下的類名生成對應的實例。io

  • 爲之賦值ast

    1. 利用kvc爲之賦值
    2. 利用runtime爲之賦值

    在demo中我採用的是利用runtime爲之賦值,kvc的方式沒有實踐過,此處就留個讀者本身拓展實現了

Demo

在Demo中我採用的存儲方式是plist文件形式存儲,爲視圖賦值採用的是runtime形式,並在其中添加了健壯性檢測,防止本地文件被修改後致使的錯誤 Demo地址

遭遇的坑

  • 思考過不須要視圖實現任何方法,直接用運行時獲得全部屬性存儲起來,可是因爲沒法區分屬性的私有的仍是公開的,若是取屬性會把全部的包括UIView,layer等展現屬性也給存起來,因此做罷
  • 使用過讓視圖傳必要屬性的以及其對應的值回來,可是Demo中健壯性檢測不太方便作,並且實現層面須要多寫代碼,不合算。仔細考慮了一下kvc就只須要key在用kvc取value就能夠了
相關文章
相關標籤/搜索