Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@EnvironmentObject 본문

SwiftUI

@EnvironmentObject

JangJupyo 2020. 10. 14. 15:10
728x90
반응형

@EnvironmentObject는 SwiftUI에서 앱의 여러 뷰들 사이에서 공통 상태를 공유하고, 쉽게 전달할 수 있도록 도와주는 프로퍼티 래퍼입니다. 이는 주로 전역적인 상태나 공유 상태를 관리할 때 사용됩니다.

@EnvironmentObject는 부모 뷰에서 자식 뷰로 명시적으로 상태를 전달할 필요 없이, 뷰 계층 전체에서 사용할 수 있게 해줍니다.

 

기본 개념

  • 공유 상태 관리: @EnvironmentObject는 하나의 객체를 여러 뷰에서 참조하고, 그 상태를 쉽게 변경하거나 접근할 수 있게 합니다. 이 객체는 주로 ObservableObject 프로토콜을 채택한 클래스로 만들어집니다.
  • 자동 전달: @EnvironmentObject는 뷰 간의 계층 구조에서 자동으로 전달되기 때문에, 명시적으로 뷰 간에 데이터를 전달할 필요가 없습니다. 이는 복잡한 뷰 계층에서도 매우 유용합니다.

 

사용 방법

  1. ObservableObject 정의: @EnvironmentObject로 사용할 상태 객체는 ObservableObject 프로토콜을 채택한 클래스로 정의되어야 합니다.
  2. EnvironmentObject로 주입: 부모 뷰에서 environmentObject(_:) 메서드를 사용하여 뷰 계층에 해당 상태 객체를 주입합니다.
  3. @EnvironmentObject로 사용: 자식 뷰에서는 @EnvironmentObject로 상태 객체에 접근합니다.

 

코드 예시

ObservableObject 클래스 정의

import SwiftUI
import Combine

class UserSettings: ObservableObject {
	@Published var username: String = "Guest"
}
  • UserSettings 클래스는 ObservableObject를 채택하고, @Published를 사용하여 username 상태가 변경될 때마다 이를 감지할 수 있도록 만듭니다.

 

부모 뷰에서 environmentObject 사용

struct ParentView: View {
	@StateObject private var userSettings = UserSettings()
    
    var body: some View {
    	ChildView()
        	.environmentObject(userSettings)	// userSettings 객체를 뷰 계층에 주입
    }
}
  • ParentView에서 UserSettings 객체를 @StateObject로 생성하고, environmentObject(_:) 메서드를 사용해 뷰 객체에 이 객체를 전달합니다.

 

자식 뷰에서 @EnvironmentObject 사용

struct ChildView: View {
	@EnvironmentObject var userSettings: UserSettings
    
    var body: some View {
    	VStack {
        	Text("Username: \(userSettings.username)")
            Button("Change Username") {
            	userSettings.username = "NewUser"
            }
        }
    }
}
  • ChildView에서 @EnvironmentObject를 사용해 userSettings에 접근합니다. 이 상태 객체는 ParentView에서 전달받은 객체와 동일하며, 이를 수정할 때 부모 뷰와 모든 자식 뷰에 반영됩니다.

 

주요 특징

  1. 전역적 상태 공유: @EnvironmentObject는 앱의 여러 뷰에서 동일한 객체를 공유하므로, 전역 상태 관리가 필요할 때 유용합니다. 예를 들어 사용자 설정이나 로그인 상태와 같은 데이터를 쉽게 공유할 수 있습니다.
  2. 자동으로 전달: 뷰 계층에서 명시적으로 데이터를 전달하지 않아도 되기 때문에, 매우 복잡한 뷰 계층 구조에서도 사용하기 좋습니다.
  3. 반응형 업데이트: @EnvironmentObject로 참조된 객체가 변경될 때, 해당 객체를 참조하는 모든 뷰가 자동으로 업데이트됩니다.

 

@Binding 및 @State와의 차이점

  • @State: 특정 뷰 내부에서만 상태를 관리할 때 사용됩니다. 상태는 뷰 내부에서만 국한됩니다.
  • @Binding: 부모 뷰의 상태를 자식 뷰에 전달하고, 자식 뷰에서 그 상태를 수정할 때 사용됩니다.
  • @EnvironmentObject: 전역 상태를 여러 뷰에 걸쳐 쉽게 전달하고, 관리하는 데 사용됩니다. 상위 뷰에서 전달한 상태 객체를 계층 구조 전체에서 사용할 수 있습니다.

 

@EnvironmentObject의 장점

  • 간편한 상태 전달: 자식 뷰에서 명시적으로 상태를 전달할 필요가 없으며, 뷰 계층 어디에서나 객체에 접근할 수 있습니다.
  • 전역 상태 관리: 로그인 정보나 테마 설정과 같이 앱 전역에서 필요로 하는 상태를 쉽게 관리할 수 있습니다.
  • 리팩토링 용이성: 뷰 계층이 깊어져도 상태 전달이 자동으로 이루어지기 때문에, 코드 리팩토링 시에도 쉽게 상태 관리를 유지할 수 있습니다.

 

결론

@EnvironmentObject는 SwiftUI에서 앱의 여러 뷰 간에 전역적인 상태를 공유하고 관리하는 데 매우 유용한 도구입니다. 이를 통해 뷰 계층 간에 복잡한 상태 전달 없이 상태를 자동으로 공유하고 관리할 수 있습니다.

ObservableObject와 함께 사용하면 상태가 변경될 때 자동으로 UI가 업데이트되므로, 반응형 앱을 쉽게 만들 수 있습니다.

반응형

'SwiftUI' 카테고리의 다른 글

ObservableObject  (0) 2020.10.15
@State  (0) 2020.10.15
Spacing & Spacer  (0) 2020.10.13
ForEach  (0) 2020.10.13
Image RenderingMode  (0) 2020.10.12