티스토리 뷰
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())
을 써줘야 돌아간다.
'macOS, iOS' 카테고리의 다른 글
enum의 rawValue (0) | 2020.01.08 |
---|---|
[iOS] Xcode Target 분리하기 (1) | 2020.01.08 |
[iOS] SwiftUI에서 UIView를 wrapping 해서 사용하는 법 (0) | 2020.01.07 |
[iOS] SwiftUI에서 Localization 하기 (0) | 2020.01.06 |
[iOS] SwiftUI의 Preview Size, Device 종류 바꾸기 (0) | 2020.01.06 |