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

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

Сейчас он работает нормально.

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

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

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

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

Ответ 1

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

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

  • Обычно вам нужно выполнить любые операции для сохранения состояния в 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