Мое приложение имеет простую организацию, которую я настроил в раскадровке 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), в случае, если те актуальны.
Эта страница также гласит: «Если контроллер времени всегда загружается из основного файла раскадровки вашего приложения во время запуска, не назначайте класс восстановления. Вместо этого пусть ваш делегат приложения найдет объект или воспользуется поддержкой UIKit для неявного поиск восстановленных объектов ". Но это хорошая идея попробовать. Я посмотрю, работает ли явное название классов восстановления. – Aneel
Внимательно прочитайте 4-х точечный процесс, который вы цитируете, вам еще нужно реализовать viewControllerWithRestorationIdentifierPath на шаге 2. Пункты 3. и 4. могут вводить в заблуждение, но читать через абзац ниже ... «UIKit перестает пытаться найти ваш контроллер просмотра» , – Mundi
Я попытался добавить явный класс восстановления, и это не устраняет проблему. Следуя примеру списка 4-1 в разделе «Сохранение и восстановление штата», я попытался восстановить вид детали с помощью раскадровки. Оказывается, ключ раскадровки - это ноль! Думаю, это означает, что Какао считает, что представление не было создано из раскадровки в первую очередь? Для меня это не имеет смысла, поскольку это было ясно. – Aneel