@EnvironmentObject를 이용하면 어디에서나 데이터에 액세스 가능.
ObservableObject를 environment에 저장해, 여러 화면에서 데이터 공유가 가능하다.
// 여러 화면과 공유하고자 하는 데이터
// ObservableObject 프로토콜 채택
class Animal: ObservableObject {
@Published var animal: String = ""
}
struct ThisIsEnvironmentObject: View {
var body: some View {
TabView {
TabOne()
.tabItem {
Image(systemName: "1.circle")
Text("One")
}
TabTwo()
.tabItem {
Image(systemName: "2.circle")
Text("Two")
}
}
// ObservableObject를 다른 뷰와 공유하는 방법
// .environmentObject 수정자를 사용하면 TabView의 모든 하위 뷰에서 ObservableObject 사용이 가능함.
// 즉 여기서 TabView 아래의 모든 자식 뷰들은 동일한 객체에 액세스 할 수 있다.
.environmentObject(Animal())
.font(.title)
}
}
struct TabOne: View {
@EnvironmentObject var animal: Animal
var body: some View {
VStack {
Text("탭 1")
.font(.largeTitle)
Text("EnvironmentObject란??")
.font(.title)
.padding()
Text("environmentObject를 사용해 부모 뷰에 ObservableObject를 추가한다.")
.font(.headline)
.padding()
Spacer()
TextField("동물 입력하기 :: ", text: $animal.animal)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.horizontal)
Spacer()
}
}
}
struct TabTwo: View {
@EnvironmentObject var animal: Animal
var body: some View {
VStack {
Text("탭 2")
.font(.largeTitle)
Text("EnvironmentObject란??")
.font(.title)
.padding()
Text("이 뷰에서는 @EnvironmentObject를 사용해 environment객체에 액세스가 가능하다. ")
.font(.headline)
.padding()
Spacer()
Text("탭 1에서 입력한 동물은? ::")
.padding()
Text("\(animal.animal)")
.bold()
Spacer()
}
}
}
@main
struct AboutEnvironmentObject: App {
var body: some Scene {
WindowGroup {
EnvironmentObjectGlobalAccess()
.environmentObject(Animal())
}
}
}
루트 뷰에 .environmentObject() 수정자를 사용해 ObservableObject 객체를 전달하면, 앱 내의 모든 계층에서 해당 데이터에 전역적으로 접근이 가능함.