Сохранение состояния приложения при перезапуске - PullRequest
5 голосов
/ 01 декабря 2008

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 01 декабря 2008

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

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

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

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

5 голосов
/ 01 декабря 2008

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

3 голосов
/ 01 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...