Как сохранить состояние приложения iPhone до его закрытия? - PullRequest
11 голосов
/ 28 ноября 2009

Я разработал приложение для iPhone с панелью вкладок и контроллерами навигации.

Пока работает нормально.

Теперь я хочу, чтобы приложение сохранило свое состояние перед выходом.

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

Я видел несколько вопросов на эту тему, но я более озадачен, увидев их,

Может кто-нибудь сказать мне прямой способ сделать это?

1 Ответ

27 голосов
/ 28 ноября 2009

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

Однако есть несколько общих советов и указателей, которые помогут вам выбрать правильное решение для сохранения состояния:

  1. Обычно вы хотите выполнить любые операции для сохранения состояния в applicationWillTerminate: в делегате приложения или прослушивания UIApplicationWillTerminateNotification в других классах.

  2. Посмотрите на NSUserDefaults. Вы можете использовать NSUserDefaults для хранения пар ключ / значение (аналогично NSDictionary, хотя вы можете хранить только объекты, которые реализуют NSCoding в NSUserDefaults), относящиеся к предпочтениям или другой информации , Используйте NSUserDefaults для хранения информации о состоянии. Одно предупреждение - вы не должны использовать NSUserDefaults для хранения больших объемов данных, так как это замедлит время запуска вашего приложения (так как значения загружаются при запуске).

  3. Более конкретно для вашего случая ... если все, что вы хотите сделать, это сохранить выбранную вкладку между приложениями, вы должны реализовать applicationWillTerminate: и использовать NSUserDefaults для сохранения индекса выбранной вкладки. Затем в вашей реализации applicationDidFinishLaunching: вы проверите существование такого ключа NSUserDefaults и установите выбранный индекс UITabBarController на сохраненное значение, если оно существует.

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

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

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

Вот пример использования NSUserDefaults: http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847

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