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

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

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

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

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

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


person lawrence    schedule 30.11.2008    source источник


Ответы (3)


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

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

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

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

person Matt Gallagher    schedule 30.11.2008

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

person August    schedule 01.12.2008

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

person superfell    schedule 30.11.2008