2013-10-07 2 views
2

Мое приложение имеет простую организацию, которую я настроил в раскадровке Interface Builder (не в коде). Существует контроллер навигации, который имеет свой контроллер корневого представления, установленный на мой главный контроллер просмотра. Мой основной вид содержит таблицу, в которой ячейки переходят к контроллеру подробного представления.Почему мое приложение не возвращается к моему подробному представлению при его восстановлении?

Когда я приостанавливаю приложение, просматривая подробный вид, а затем возобновляю его, я возвращаюсь к главному виду, а не к представлению «Детали». Почему это может быть?

Детали:

Я набор идентификаторов Восстановление в Interface Builder для навигации View Controller, Главного View Controller и Detail View Controller. Я также попытался добавить идентификатор восстановления в представление таблицы и заставить Main View Controller реализовать UIDataSourceModelAssociation.

Мое приложение возвращает YES из mustRestoreApplicationState, и как в режиме основного вида, так и в режиме детализации имеют методы кодирования/декодированияRestorableStateWithCoder.

Я тестирую приостановку/возобновление работы с помощью симулятора: я запустил приложение, перейдя к деталям, нажмите кнопку «Домой», а затем нажмите кнопку «Стоп» в 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 

В дополнение к неправильному зрения восстанавливается, есть что-то еще странным: почему это Путь Восстановление Identifier для подробного просмотра «Навигация/Детальный просмотр», а не «Навигация/Основной просмотр/Детальный просмотр»? Прямой связи между контроллером навигационного представления и контроллером подробного представления нет. Их единственное соединение в Interface Builder осуществляется через segue из Main View.

Я что-то неправильно сконфигурировал?

Я попытался назначить класс восстановления для подробного просмотра. Когда этот код восстановления вызывается, он терпит неудачу, потому что UIStateRestorationViewControllerStoryboardKey не установлен в кодере.

Вот игрушка версия моего проекта, который дублирует эту проблему: https://github.com/WanderingStar/RestorationTest

Я пытаюсь это с XCode версии 5.0 (5A1413) и IOS Simulator Version 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-х точечный процесс, который вы цитируете, вам еще нужно реализовать viewControllerWithRestorationIdentifierPath на шаге 2. Пункты 3. и 4. могут вводить в заблуждение, но читать через абзац ниже ... «UIKit перестает пытаться найти ваш контроллер просмотра» , – Mundi

+0

Я попытался добавить явный класс восстановления, и это не устраняет проблему. Следуя примеру списка 4-1 в разделе «Сохранение и восстановление штата», я попытался восстановить вид детали с помощью раскадровки. Оказывается, ключ раскадровки - это ноль! Думаю, это означает, что Какао считает, что представление не было создано из раскадровки в первую очередь? Для меня это не имеет смысла, поскольку это было ясно. – Aneel