Как сохранить состояние приложения iPhone до его закрытия?
-
06-07-2019 - |
Вопрос
Я разработал приложение для 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