我的應用程序有一個簡單的組織,我在界面生成器故事板(而不是代碼)中配置。有一個導航視圖控制器,其根視圖控制器設置爲我的主視圖控制器。我的主視圖包含一個表格,其中單元格延伸到Detail View Controller。爲什麼我的應用程序在恢復時不能返回到我的詳細信息視圖?
當我在查看細節視圖的同時暫停應用程序,然後恢復它時,我返回到主視圖,而不是細節視圖。爲什麼會這樣呢?
詳情:
我已經在Interface Builder設置恢復爲標識的導航視圖控制器,主視圖控制器和詳細視圖控制器。我也嘗試在表視圖中添加一個恢復ID,並使主視圖控制器實現UIDataSourceModelAssociation。
我的應用程序從shouldRestoreApplicationState返回YES,並且Main View和Detail View都有encode/decodeRestorableStateWithCoder方法。
我使用模擬器測試暫停/恢復:我運行應用程序,導航到詳細信息視圖,點擊主頁按鈕,然後單擊XCode中的停止按鈕。爲了恢復,我再次從XCode運行應用程序。
我看到在以下呼叫暫停:
AppDelegate shouldSaveApplicationState
MainViewController encodeRestorableStateWithCoder
DetailViewController encodeRestorableStateWithCoder
而且在簡歷:
AppDelegate shouldRestoreApplicationState
AppDelegate viewControllerWithRestorationIdentifierPath Navigation
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/MainView
MainViewController viewDidLoad
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/DetailView
MainViewController decodeRestorableStateWithCoder
除了錯誤的看法正在恢復,還有別的奇怪:爲什麼恢復標識符路徑爲詳細視圖「導航/ DetailView」而不是「導航/ MainView/DetailView」?導航視圖控制器和詳細視圖控制器之間沒有直接關係。它們在Interface Builder中的唯一連接是通過主視圖中的segue。
我的配置有誤嗎?
我曾嘗試將恢復類分配給詳細視圖。當該恢復代碼被調用時,它會失敗,因爲編碼器中未設置UIStateRestorationViewControllerStoryboardKey。
這裏是我的項目,該項目複製問題的玩具版本:https://github.com/WanderingStar/RestorationTest
我用了XCode 5.0版(5A1413)和iOS模擬器版本7.0(463.9.4)嘗試此,如果這些都是相關的。
該頁面還說:「如果視圖控制器始終在啓動時從應用程序的主要故事板文件加載,請不要指定恢復類,而應讓您的應用程序委託查找對象或利用UIKit的隱式支持找到恢復的對象。「 但這是一個好主意嘗試。我會看看是否明確命名恢復類的作品。 – Aneel
仔細閱讀你引用的4點過程,你仍然必須在第2步中實現viewControllerWithRestorationIdentifierPath。第3點和第4點可能會引起誤解,但請閱讀下面的段落...「UIKit停止嘗試查找視圖控制器」 。 – Mundi
我試着添加一個明確的恢復類,它不能解決問題。在State Preservation and Restoration部分的清單4-1的示例之後,我嘗試使用故事板恢復Detail視圖。事實證明,故事板的關鍵是零!我猜這意味着Cocoa認爲這個視圖並不是從故事板中初始化的?這對我來說毫無意義,因爲它顯然是。 – Aneel