부모뷰나 그 상위 뷰가 제공하는 ObserbableObject를 위한 프로퍼티 래퍼 타입입니다.
가장 큰 특징은 EnvironmentObject로 선언된 인스턴스의 값이 다른 뷰에서 값이 바꿀 수 있으며 @StateObject를 사용하면 그에 대응하는 즉각적인 행동을 취할 수 있다는 것입니다.
EnvironmentObject 는 앱의 많은 뷰와 공유해야하는 데이터인 경우 사용되는 프로퍼티 래퍼입니다.
EnvironmentObject를 사용하면 데이터가 변경 될 때 뷰가 자동으로 업데이트 된 상태로 유지되고 @ObservedObject를 사용하지 않아도 됩니다, 하지만 Observable 객체와 같은 방식으로 선언되어 반드시 ObservableObject 프로토콜을 준수해야합니다.
@ObservedObject 하고 가장 큰 차이점은 뷰에서 뷰로 전달할 필요 없이 모든 뷰가 접근할 수 있다는 것입니다.
다음은 간단한 @EnvironmentObject를 사용하여 구현한 2개의 뷰입니다.
우선 ObservableObject 프로토콜을 준수하는 클래스에 다른 뷰에서도 사용할 수 있는 @Published 프로퍼티 래퍼로 선언된 변수를 만듭니다.
class MyObservableObject: ObservableObject {
@Published var isOn = false
}
다음으로는 @main 진입점이 되는 EnvironemntObjectTestApp에 environmentObject를 사용하여 뷰 하위 계층에 ObservableObject를 제공합니다. 즉 여기서 ObservableObject인 myObject 객체를 뷰 하위 계층에서 사용할 수 있게 해줍니다.
import SwiftUI
@main
struct EnvironmentObjectTestApp: App {
@State var myObject = MyObservableObject()
var body: some Scene {
WindowGroup {
ContentView()
}
.environmentObject(myObject)
}
}
다음으로는 @EnvironmentObject MyObject 를 선언하여 Binding처럼 자식 뷰에 따로 객체를 넘기지 않아도 @EnvironmentObject MyObject를 통해 하나의 MyObservableObject 클래스 객체를 여러 뷰에서 공유할 수 있는 것을 확인할 수 있습니다. 여기서 객체의 이름은 서로 달라도 똑같이 동작합니다.
import SwiftUI
struct ContentView: View {
@EnvironmentObject var MyObject: MyObservableObject
@State private var isSecondViewActive = false
var body: some View {
NavigationStack {
VStack {
Color(MyObject.isOn ? .red : .blue)
HStack {
Button {
MyObject.isOn.toggle()
} label: {
Text("버튼")
}
NavigationLink(destination: SecondView()) {
Text("다음화면")
}
}
}
.padding()
}
}
}
struct SecondView: View {
@EnvironmentObject var MyObject: MyObservableObject
var body: some View {
VStack {
Color(MyObject.isOn ? .red : .blue)
HStack {
Button {
MyObject.isOn.toggle()
} label: {
Text("버튼")
}
NavigationLink(destination: ContentView()) {
Text("이전화면")
}
}
}
.padding()
}
}
'SwiftUI' 카테고리의 다른 글
Keychain services (0) | 2023.11.16 |
---|---|
Core Data (0) | 2023.11.16 |
NSCoding (0) | 2023.11.13 |
Archiving, encoding, decoding (0) | 2023.11.13 |
Bundle (0) | 2023.11.12 |