Разработка
Поваренная книга SwiftUI: использование AppStorage и SceneStorage для хранения состояния
SwiftUI предоставляет обертки свойств AppStorage и SceneStorage, чтобы облегчить хранение состояний в вашем приложении.
SwiftUI предоставляет обертки свойств AppStorage и SceneStorage, чтобы облегчить хранение состояний в вашем приложении. В этом разделе мы расскажем вам об использовании этих оберток, покажем, как реализовать их в коде, и приведем примеры их применения.
Обертка свойств AppStorage в SwiftUI
AppStorage
— это обертка свойств, которая позволяет вам легко считывать и записывать значения из UserDefaults
. Это идеальный инструмент для хранения пользовательских настроек или других небольших данных, которые должны сохраняться между запусками приложения.
Рассмотрим пример, когда у вас есть экран входа в систему, и вы хотите запомнить имя пользователя, вошедшего в систему. Для этого можно использовать обертку свойства AppStorage
:
struct ContentView: View { @AppStorage("username") var username: String = "Anonymous" var body: some View { VStack { Text("Welcome, \(username)!") Button("Log in") { username = "SuzGupta" } } } }
Ваш предварительный просмотр должен выглядеть следующим образом:
В этом коде @AppStorage("username")
следит за UserDefaults
на предмет наличия ключа «username
«. Изменение имени пользователя приведет к немедленной записи новой строки в UserDefaults, а также к обновлению представления. Обратите внимание, что UserDefaults
не является безопасным хранилищем, поэтому вам не следует сохранять конфиденциальные данные с помощью AppStorage
.
Обертка свойств SceneStorage в SwiftUI
SceneStorage — это обертка свойств, которую можно использовать, когда требуется автоматическое восстановление состояния значения. Она функционирует аналогично State
, но его начальное значение восстанавливается системой, если оно было сохранено ранее, и это значение используется совместно с другими переменными SceneStorage
в той же сцене. Система управляет сохранением и восстановлением данных SceneStorage
от вашего имени. Каждая сцена имеет свое собственное представление о SceneStorage
, поэтому данные между сценами не шарятся.
Таким образом SceneStorage
следует использовать с легковесными данными. Большие данные, такие как данные модели, могут привести к снижению производительности при хранении в SceneStorage
. Кроме того, при явном уничтожении сцены данные SceneStorage
также уничтожаются.
Вот пример того, как SceneStorage
можно использовать для сохранения и восстановления выбранной вкладки в TabView
:
struct ContentView: View { @SceneStorage("selectedTab") var selectedTab: String? var body: some View { TabView(selection: $selectedTab) { Text("Tab 1") .tabItem { Label("Tab 1", systemImage: "1.circle") } .tag("Tab1") Text("Tab 2") .tabItem { Label("Tab 2", systemImage: "2.circle") } .tag("Tab2") } } }
Ваш предварительный просмотр должен выглядеть следующим образом:
В этом примере переменная selectedTab
помечена оберткой свойства @SceneStorage
, что означает, что ее значение автоматически сохраняется и восстанавливается при запуске приложения или восстановлении сцены. Если выйти из приложения и запустить его заново, оно автоматически выберет вкладку, которая была открыта последней.
← Предыдущая статья: Использование Combine с SwiftUI для управления состояниями