Цель: Я пытаюсь восстановить состояние в приложении контроллера на основе табуляции (с навигационными контроллерами на каждой вкладке).Состояние восстановления в панели вкладок и контроллера навигационного приложения
Проблема: При повторном запуске выбранная вкладка, как представляется, восстанавливается, как и ожидалось, но иерархия навигации внутри указанной вкладки не является.
развития:
- Я первый начал с шаблоном проекта "Tab на основе приложения".
- Затем я добавил идентификаторы восстановления как для дочерних контроллеров представления, так и для контроллера панели вкладок.
- В делегате приложения я внедрил
application(_:shouldSaveApplicationState:)
иapplication(_:shouldRestoreApplicationState:)
.
Я запускаю приложение, переключаюсь на вторую (правую) вкладку, ударяю домой, завершаю. o перезапуск, отображается правая вкладка (как и ожидалось). Пока все хорошо.
- Далее я перехожу к раскадровке и вставляю оба дочерних контроллера в соответствующие контроллеры навигации и назначаю их идентификаторам восстановления.
Запуск приложения, и восстановление все еще работает. Все еще хорошо.
Далее я добавляю контроллер детали «detail»; его класс является специальным подклассом
UIViewController
на раскадровку со свойствами для настройки содержимого метки отладки и цвета фона его представления.Я поместил кнопку «Показать детали ...» на каждом из контроллеров верхнего уровня вкладок и создаю segue из каждого в контроллер общего представления. Итак, теперь моя раскадровка выглядит как шестиугольник (также, оба segues имеют идентификаторы, установленные в Interface Builder). Таким образом, как левый, так и правый контроллер верхнего уровня совместно используют один и тот же тип «подробного» контроллера вида. В режиме показа он настроен так, чтобы отличать его от того, куда он был нажат (см. Следующую точку).
На каждом из методов управления верхнего вида
prepareForSegue(_:sender:)
я настраиваю контроллер точечного подробного представления по-разному: разные цвета текста и фона («слева» и «синий», «правый» и красный соответственно).Я добавил код в контроллер подробного представления, чтобы сохранить и восстановить состояние текста и цветов фона:
encodeRestorableStateWithCoder(_:)
иdecodeRestorableStateWithCoder(_:)
. Кроме того, я реализовалviewDidLoad()
, чтобы отразить значения этих свойств в представлении. Всякий раз, когда он создается и вводится в навигацию через segue, свойства сначала устанавливаются, а затем используются для настройки вида вviewDidLoad()
. Всякий раз, когда он создается при восстановлении, свойства устанавливаются вdecodeRestorableStateWithCoder(_:)
и аналогичным образом используются вviewDidLoad()
.
... но когда я запускаю этот код, последняя выбранная вкладка восстанавливается, но только до верхнего контроллера представления -Выберите или право-, не деталь.Интересно, что цвет фона, последний установленный для элемента управления подробным представлением, мигает на мгновение.
Я поставил точки останова в encodeRestorableStateWithCoder(_:)
и decodeRestorableStateWithCoder(_:)
, но только первый из них выполняется (закодировать).
- Подумав, что может не хватать, я пошел вперед и внедрил делегат приложения
application(_:viewControllerWithRestorationIdentifierPath:coder:)
(всегда возвращаемый ноль, но протоколирование переданных компонентов пути).
В документации не очень ясно, нужен ли этот метод или нет, и в любом случае все контроллеры просмотра, за исключением деталей, как представляется, полностью восстанавливаются даже без него. Я добавил код для создания экземпляра каждого контроллера представления на основе последнего компонента пути (т. Е. Идентификатора восстановления контроллера) и возврата его.
Теперь decodeRestorableStateWithCoder(_:)
называется, но навигация по-прежнему возвращается к контроллеру верхнего уровня отображения после секунды.
Итак, что происходит? Что мне не хватает для реализации сохранения и восстановления состояния в приложении «Панель вкладок + приложение навигационного контроллера»?