Сохранение состояния приложения при перезапусках

Я пытался сохранить состояние своего приложения для iPhone, сериализуя мой основной UITabBarController с помощью [NSKeyedArchiver archiveRootObject:toFile:], но у меня возникают трудности.

Сначала у меня была проблема с UIImage, поскольку он не реализует протокол NSCoding, но я решил это, создав категорию расширения для UIImage, которая хранит и извлекает необработанные данные изображения.

Проблема, на которой я сейчас застрял, заключается в том, что моих контроллеров представления нет, когда я восстанавливаю из архива. У меня есть UINavigationControllers на каждой из моих вкладок, и когда я восстанавливаю, UINavigationItem все еще там (я могу использовать кнопки «Назад» и так далее, чтобы их изменить), но контроллеры просмотра просто исчезли.

Я вижу, что свойство UINavigationControllerviewControllers помечено как (nonatomic, copy). Означает ли это, что когда вы архивируете UINavigationController, он не включает свой стек контроллеров представления? Если да, то как я могу это обойти? Сначала я подумал, что переопределю методы NSCoding для UINavigationController, но это мешает инициализации из файла NIB.

Я немного обеспокоен тем, что у меня возникли большие трудности с сохранением состояния приложения. Я подумал, что это достаточно распространенный вариант использования, который будет несложно реализовать. Я что-то упустил?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
1 884
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Мне тоже никогда не удавалось заставить этот подход работать. То, что у меня было, было моим собственным протоколом, и каждый контроллер представления должен был сохранять / восстанавливать метаданные, необходимые для этого представления (вам не нужно сохранять данные изображения, например, просто имя изображения). Как только у вас есть это, довольно легко написать общий код для обхода контроллеров навигации (+ стеки) и сохранения / восстановления всего набора данных. звучит как много работы, но на самом деле это было довольно легко.

Ответ принят как подходящий

Атрибуты в @property имеют мало или не имеют ничего общего с поведением архивирования (они только описывают, как работают геттеры и сеттеры).

Кроме того, тот факт, что классы пользовательского интерфейса поддерживают NSCoding, не означает, что его можно использовать для восстановления состояния. В большинстве случаев они поддерживают NSCoding, поэтому их можно создавать и загружать из файла NIB с помощью Interface Builder. Если вы подумаете обо всех битах состояния, которые вы установили не могу в Интерфейсном Разработчике - любое количество этих функций может не поддерживаться реализацией класса NSCoding.

Обычно люди не используют NSCoding для хранения состояния приложения, потому что именно то, что составляет состояние приложения, зависит от вашего приложения.

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

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

Другие вопросы по теме