2015-09-09 2 views
8

Цель: Я пытаюсь восстановить состояние в приложении контроллера на основе табуляции (с навигационными контроллерами на каждой вкладке).Состояние восстановления в панели вкладок и контроллера навигационного приложения

Проблема: При повторном запуске выбранная вкладка, как представляется, восстанавливается, как и ожидалось, но иерархия навигации внутри указанной вкладки не является.

развития:

  1. Я первый начал с шаблоном проекта "Tab на основе приложения".
  2. Затем я добавил идентификаторы восстановления как для дочерних контроллеров представления, так и для контроллера панели вкладок.
  3. В делегате приложения я внедрил application(_:shouldSaveApplicationState:) и application(_:shouldRestoreApplicationState:).

Я запускаю приложение, переключаюсь на вторую (правую) вкладку, ударяю домой, завершаю. o перезапуск, отображается правая вкладка (как и ожидалось). Пока все хорошо.

  1. Далее я перехожу к раскадровке и вставляю оба дочерних контроллера в соответствующие контроллеры навигации и назначаю их идентификаторам восстановления.

Запуск приложения, и восстановление все еще работает. Все еще хорошо.

  1. Далее я добавляю контроллер детали «detail»; его класс является специальным подклассом UIViewController на раскадровку со свойствами для настройки содержимого метки отладки и цвета фона его представления.

  2. Я поместил кнопку «Показать детали ...» на каждом из контроллеров верхнего уровня вкладок и создаю segue из каждого в контроллер общего представления. Итак, теперь моя раскадровка выглядит как шестиугольник (также, оба segues имеют идентификаторы, установленные в Interface Builder). Таким образом, как левый, так и правый контроллер верхнего уровня совместно используют один и тот же тип «подробного» контроллера вида. В режиме показа он настроен так, чтобы отличать его от того, куда он был нажат (см. Следующую точку).

  3. На каждом из методов управления верхнего вида prepareForSegue(_:sender:) я настраиваю контроллер точечного подробного представления по-разному: разные цвета текста и фона («слева» и «синий», «правый» и красный соответственно).

  4. Я добавил код в контроллер подробного представления, чтобы сохранить и восстановить состояние текста и цветов фона: encodeRestorableStateWithCoder(_:) и decodeRestorableStateWithCoder(_:). Кроме того, я реализовал viewDidLoad(), чтобы отразить значения этих свойств в представлении. Всякий раз, когда он создается и вводится в навигацию через segue, свойства сначала устанавливаются, а затем используются для настройки вида в viewDidLoad(). Всякий раз, когда он создается при восстановлении, свойства устанавливаются в decodeRestorableStateWithCoder(_:) и аналогичным образом используются в viewDidLoad().

... но когда я запускаю этот код, последняя выбранная вкладка восстанавливается, но только до верхнего контроллера представления -Выберите или право-, не деталь.Интересно, что цвет фона, последний установленный для элемента управления подробным представлением, мигает на мгновение.

Я поставил точки останова в encodeRestorableStateWithCoder(_:) и decodeRestorableStateWithCoder(_:), но только первый из них выполняется (закодировать).

  1. Подумав, что может не хватать, я пошел вперед и внедрил делегат приложения application(_:viewControllerWithRestorationIdentifierPath:coder:) (всегда возвращаемый ноль, но протоколирование переданных компонентов пути).

В документации не очень ясно, нужен ли этот метод или нет, и в любом случае все контроллеры просмотра, за исключением деталей, как представляется, полностью восстанавливаются даже без него. Я добавил код для создания экземпляра каждого контроллера представления на основе последнего компонента пути (т. Е. Идентификатора восстановления контроллера) и возврата его.

Теперь decodeRestorableStateWithCoder(_:)называется, но навигация по-прежнему возвращается к контроллеру верхнего уровня отображения после секунды.

Итак, что происходит? Что мне не хватает для реализации сохранения и восстановления состояния в приложении «Панель вкладок + приложение навигационного контроллера»?

ответ

6

FIXED: Итак, есть несколько проблем с моим кодом ...

  1. Оказывается, что в моем случае, мне не нужно реализовать application(_:viewControllerWithRestorationIdentifierPath:coder:). (См comments of this answer)

  2. Мои реализаций encodeRestorableStateWithCoder(_:) и decodeRestorableStateWithCoder(_:) не называли super (как это было предложено в accepted answer на вопрос выше).

  3. Наконец, я получил правильный контроллер (подробно), но его состояние субстранов (содержимое текстовых ярлыков и цвет основного фона) были в начальном, пустом состоянии (не восстанавливаясь до последнего состояния - т.е. содержание текстовых ярлыков и цвет bg). Как упоминалось в this question, viewDidLoad() имеет значение , но не, называемый сразу после decodeRestorableStateWithCoder(_:) (как я предполагал), поэтому вместо этого я вызываю общий метод как из viewDidLoad(), так и decodeRestorableStateWithCoder(_:) для обновления пользовательского интерфейса.

Как обычно, я бросился задавать вопрос перед поиском или попыткой внести изменения в свой код (мои извинения ...).

Я надеюсь, что это по крайней мере поможет кому-то другому.

Как обычно, я подожду несколько дней, прежде чем принять свой собственный ответ, если кто-то проливает дополнительный свет.

Смежные вопросы