일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- operator
- swift6
- graphql
- NullObject
- typeorm
- subject
- nestjs
- RFC1738/1808
- init
- Operater
- Bug
- Xcode
- RxSwift
- NavigationLink
- SWIFT
- dismiss
- @EnvironmentObject
- @State
- init?
- @Environment
- URL(string:)
- vim
- ios14
- SwiftUI
- IOS
- RxCocoa
- nonisolated
- Creating Operators
- Operators
- @Binding
- Today
- Total
Tunko Development Diary
[SwiftUI] Environment 객체 정리 본문
구독 객체는 특정 상태가 앱 내의 몇몇 SwiftUI 뷰에 의해 사용되어야 할 겨우에 가장 적합하다. 그런데 어떤 뷰에서 다른뷰로 이동(navigation) 하는데 이동될 뷰에서도 동일한 구독 겍체에 접근해야 한다면, 이동할 떄 대상 뷰로 구독 객체에 대한 참조체를 전달해야 할 것이다.
다음 코드에 예제를 살펴보자
@ObservedObject var demoData : DamoData = DemoData()
NavigationLing(destination : SecondView(demoData)) {
Text("Next Screen")
}
앞의 코드 선언부에서 NavigationLink는 SecondView라는 이름의 다른 뷰로 이동하기 위해 사용되며, demoData객체에 대한 참조체를 전달한다.
이 방법은 여러 상황에 사용될 수 있지만, 앱 내의 여러 뷰가 동일한 구독 객체에 접근해야 하는 경우에는 복잡해질 수 있다. 이런 상황에서는 Environment 객체를 사용하는것이 더 합리적일 수 있다.
Environment 객체는Observable객체와 같은 방식으로 선언된다. 즉, 반드시 Observable Object프로토콜을 따라야 하며, 적절한 프로퍼티가 게시되어야 한다. 하지만, 중요한 차이점은 이 객체는 SwiftUI 환경에 저장되며, 뷰에서 뷰로 전달할 필요없이 모든 뷰가 접근할 수 있다는 것이다.
Environment 객체를 구독해야 하는 객체는 @ObservedObject 래퍼 대신에 @Environment Object 프로퍼티 래퍼를 이용하여 해당 객체를 참조하면 된다.
@EnvironmentObject var demoData: DemoData
Environment 객체는 옵저버(observer) 내에서 초기화될 수 없으므로 접근하는 뷰가 화면을 설정하는 동안 구성해야 한다. 여기에는 프로젝트의 SceneDelegate.swift 파일의 willConnectTo 메서드를 약간 수정하는 작업이 포함된다. 디폴트로, 이 메서드에는 다음과 같은 코드가 포함된다.
let contentView = ContentView()
let demoData = DemoData()
if let windowScene = scene as? UIWindowScene {
let window = UIWindo(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(demoData))
self.window = window
window.makeKeyAndVisible()
}
SwiftUI 프리뷰 캔버스 내에서 Environemt 객체를 사용하려면 PriviewProvider 선언 부분은 다음과 같이 수정되어야 한다.
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(DemoData())
}
}
요약
SwiftUI는 사용자 인터페이스와 앱의 로직에 데이터를 바인딩하는 방법 세 가지를 제공한다. 상태 프로퍼티는 사용자 인터페이스 레이아웃 내의 뷰 상태를 저장하는 데 사용되며, 현재 콘텐트 뷰에 관한 것이다. 이 값은 임시적이여서 해당 뷰가 사라지면 값도 없어진다.
사용자 인터페이스 밖에 있으며 앱 내의 SwiftUI뷰 구조체의 하위 뷰에만 필요한 데이터는 Observable객체 프로퍼티를 사용해야 한다. 이 방법을 사용하면 데이터를 표시하는 클래스나 구조체는 ObservableObject 프로토콜을 따라야 하며, 뷰와 바인딜 될 프로퍼티는 @Published 프로퍼티 래퍼를 사용하여 선언되어야 한다. 뷰 선언뷰에 Observable 객체 프로퍼티와 바인딩 하려면 프로퍼티는 @ ObservedObject 프로퍼티 래퍼를 사용해야 한다.
사용자 인터페이스 밖에 있으며 여러 뷰가 접근해야 하는 데이터일 경우에는 Environment 객체가 최고의 해결책이 된다. observable객체와 동일한 방법으로 선언되지만, Environment객체 바인딩은 @EnvironmentObject 프로퍼티 래퍼를 사용하여 SwiftUI 뷰 파일 내에 선언된다. SceneDelegate.swift 파일의 코드를 통해 뷰 화면이 앱에 추가될 때 Environment 객체 또한 초기화 되어야 한다.
출처 : SwiftUI 기반의 iOS 프로그래밍
'Development > iOS 개발' 카테고리의 다른 글
[SwiftUI] List 정리 (1) (0) | 2021.02.24 |
---|---|
[swift] Equatable 프로토콜 정리 (0) | 2021.02.23 |
[SwiftUI] Observable 객체 정리 (0) | 2021.02.22 |
[SwiftUI] state property 정리 (@state, @Binding) (0) | 2021.02.21 |
[swiftUI] GeometryReader 부모컨테이너 기준으로 frame을 설정 (0) | 2021.02.19 |