2013-10-07 18 views
2

我的應用程序有一個簡單的組織,我在界面生成器故事板(而不是代碼)中配置。有一個導航視圖控制器,其根視圖控制器設置爲我的主視圖控制器。我的主視圖包含一個表格,其中單元格延伸到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)嘗試此,如果這些都是相關的。

回答

4

答案竟然是簡單的:我沒有打電話

[super encodeRestorableStateWithCoder:coder]; 

在encodeRestorableStateWithCoder:編碼方法在我的視圖控制器(和解碼做同樣的...)。

本教程幫助我逐步執行過程的每個步驟,並找出我已經出了問題: http://useyourloaf.com/blog/2013/05/21/state-preservation-and-restoration.html

而且,事實證明,「導航/的DetailView」是什麼的預期。導航視圖控制器恢復其堆棧中的所有視圖,然後將它們放回堆棧,而不是每個視圖還原堆棧中的後續視圖。

0

在iOS應用程序編程指南的「狀態保存和恢復」一節中,有一個方便的checklist用於執行恢復工作。

看完你的代碼後,似乎你忘了第3步,分配恢復類。您的課程沒有這些屬性,並且您沒有在應用程序代理中實施viewControllerWithRestorationIdentifierPath

將恢復類別分配給相應的視圖控制器。(如果您不這樣做,則會要求您的應用程序委託在還原時提供相應的視圖控制器。)請參見「在啓動時恢復視圖控制器。」

+2

該頁面還說:「如果視圖控制器始終在啓動時從應用程序的主要故事板文件加載,請不要指定恢復類,而應讓您的應用程序委託查找對象或利用UIKit的隱式支持找到恢復的對象。「 但這是一個好主意嘗試。我會看看是否明確命名恢復類的作品。 – Aneel

+0

仔細閱讀你引用的4點過程,你仍然必須在第2步中實現viewControllerWithRestorationIdentifierPath。第3點和第4點可能會引起誤解,但請閱讀下面的段落...「UIKit停止嘗試查找視圖控制器」 。 – Mundi

+0

我試着添加一個明確的恢復類,它不能解決問題。在State Preservation and Restoration部分的清單4-1的示例之後,我嘗試使用故事板恢復Detail視圖。事實證明,故事板的關鍵是零!我猜這意味着Cocoa認爲這個視圖並不是從故事板中初始化的?這對我來說毫無意義,因爲它顯然是。 – Aneel

相關問題