Как сохранить состояние приложения iPhone до его закрытия?

StackOverflow https://stackoverflow.com/questions/1811696

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top