macOS, iOS
[iOS] @EnvironmentObject 써서 view들 사이의 data 공유하기
SweetDev
2020. 1. 7. 14:19
Publisher중 @EnvironmentObject는 앱이 살아있는 한, 계속 메모리에 존재하는 퍼블리셔이다.
전체 앱의 생명주기에서 계속 필요한 정보, 그리고 모든 뷰에서 필요한 정보를 갖고 있게 하면 된다.
@EnviromentObject는 data가 바뀔 때, view가 automatically updated 되는것도 보장해준다.
A, B, C, D에서 같은 @ObservedObject를 쓰려면, A에서 B로 전달, B에서 C로 전달, C에서 D로 전달해줘야 한다. 너무 귀찮다. 이런 점을 @EnvironmentObject는 깔끔하게 해결해준다. @EnviromentObject에 넣어두면 A, B, C, D에서 바로 쓸 수 있다.
** 주의점: EnvironmentObject는 조상 view에서 넘겨줘야 한다. preview crash 의 원인이 될 수도 있다. **
예제
class UserSettings: ObservableObject {
@Published var score = 0
}
UserSettings 클래스를 하나 만들었다.
이제 SceneDelegate에서,
var settings = UserSettings()
하나 만들어 주고,
window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(settings))
이런식으로 넣어주면
ContentView()에서도 쓸 수 있고, ContentView가 띄워주는 다른 뷰에서도 쓸 수 있다.
ContentView와 그가 띄워주는 뷰들에서는
@EnvironmentObject var settings: UserSettings
이렇게 써줘야하고, default value는 필요 없다.
** preview를 위해서 **
ContentView().environmentObject(UserSettings())
을 써줘야 돌아간다.