Разработка
Поваренная книга SwiftUI: шаринг состояний между представлениями с помощью объектов окружения
Свойства-обертки EnvironmentObject в SwiftUI предоставляют способ обмена данными во всем приложении.
Хотя ObservableObject
и ObservedObject
отлично подходят для обмена состоянием между представлениями, они требуют, чтобы вы передавали состояние вручную от родительского View к дочернему. Но что, если вы хотите обмениваться данными между несколькими представлениями в вашем приложении, не передавая их явно? Вот тут-то и приходят на помощь объекты окружения (Environment Objects).
Свойства-обертки EnvironmentObject
в SwiftUI предоставляют способ обмена данными во всем приложении. Их можно рассматривать как глобальное хранилище данных, к которому может обратиться любое представление. Это особенно полезно, когда у вас есть глубоко вложенные представления и вы не хотите передавать данные через несколько слоев.
Чтобы использовать объект окружения, сначала нужно определить модель данных как объект ObservableObject
. Например, создадим объект GameSettings
, в котором будет храниться счет игры.
class GameSettings: ObservableObject {
@Published var score = 0
}
Затем в корне приложения вы предоставляете этот объект иерархии представлений с помощью модификатора environmentObject
.
xxxxxxxxxx
struct ContentView: View {
var body: some View {
GameView()
.environmentObject(GameSettings())
}
}
Теперь любое представление в иерархии может получить доступ к GameSettings
, используя обертку свойства EnvironmentObject
.
xxxxxxxxxx
struct GameView: View {
@EnvironmentObject var settings: GameSettings
var body: some View {
VStack {
Text("Score: \(settings.score)")
Button("Increment Score") {
settings.score += 1
}
}
}
}
Вот как выглядит предварительный просмотр:
Используйте EnvironmentObject, чтобы сделать данные доступными во всем приложении.
В этом примере GameView
имеет доступ к объекту GameSettings
и может обновлять счет. Когда кнопка нажата, счет увеличивается, и представление Text автоматически обновляется, поскольку оно наблюдает за объектом GameSettings
.
Примечание: Обертка свойства EnvironmentObject
не предоставляет значения по умолчанию. Объект должен быть указан где-то в представлениях-предках с помощью .environmentObject(_:)
, иначе ваше приложение аварийно завершит работу.
← Предыдущая статья: Состояние, привязка, ObservableObject и ObservedObject
-
Программирование4 недели назад
Конец программирования в том виде, в котором мы его знаем
-
Видео и подкасты для разработчиков1 неделя назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Магазины приложений3 недели назад
Магазин игр Aptoide запустился на iOS в Европе
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.8