Site icon AppTractor

Поваренная книга 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 для работы с UserDefaults.

В этом коде @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")
    }
  }
}

Ваш предварительный просмотр должен выглядеть следующим образом:

Для сохранения и восстановления выбранной вкладки можно использовать обертку свойства SceneStorage.

В этом примере переменная selectedTab помечена оберткой свойства @SceneStorage, что означает, что ее значение автоматически сохраняется и восстанавливается при запуске приложения или восстановлении сцены. Если выйти из приложения и запустить его заново, оно автоматически выберет вкладку, которая была открыта последней.

Предыдущая статья: Использование Combine с SwiftUI для управления состояниями

Источник

Exit mobile version