SwiftUI의 @EnvironmentObject - 1

June·2023년 2월 16일
0

SwiftUI-Data

목록 보기
6/12
post-thumbnail

@EnvironmentObject

@EnvironmentObject를 이용하면 어디에서나 데이터에 액세스 가능.


하나의 데이터를 여러 화면에서 공유하고 싶다면?

ObservableObject를 environment에 저장해, 여러 화면에서 데이터 공유가 가능하다.

ObservableObject를 다른 뷰와 공유하는 방법

  • .environmentObject() 사용
  • .environmentObject() 수정자를 사용해 뷰에 ObservableObject를 추가하면, 해당 계층 아래의 모든 뷰에 액세스 가능함
  • 루트 뷰에 .environmentObject()를 사용해 ObservableObject를 추가하면, 전역적으로 접근 가능
// 여러 화면과 공유하고자 하는 데이터 
// ObservableObject 프로토콜 채택 
class Animal: ObservableObject {
    @Published var animal: String = ""
}


struct ThisIsEnvironmentObject: View {
    var body: some View {
        TabView {
            TabOne()
                .tabItem {
                    Image(systemName: "1.circle")
                    Text("One")
                }
            
            TabTwo()
                .tabItem {
                    Image(systemName: "2.circle")
                    Text("Two")
                }
        }
        // ObservableObject를 다른 뷰와 공유하는 방법
        // .environmentObject 수정자를 사용하면 TabView의 모든 하위 뷰에서 ObservableObject 사용이 가능함.
        // 즉 여기서 TabView 아래의 모든 자식 뷰들은 동일한 객체에 액세스 할 수 있다. 
        .environmentObject(Animal())
        .font(.title)
    }
}

struct TabOne: View {
    @EnvironmentObject var animal: Animal
    
    var body: some View {
        VStack {
            Text("탭 1")
                .font(.largeTitle)
            
            Text("EnvironmentObject란??")
                .font(.title)
                .padding()

            Text("environmentObject를 사용해 부모 뷰에 ObservableObject를 추가한다.")
                .font(.headline)
                .padding()
            
            Spacer()
            
            TextField("동물 입력하기 :: ", text: $animal.animal)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding(.horizontal)
            
            Spacer()
        }
    }
}

struct TabTwo: View {
    @EnvironmentObject var animal: Animal

    var body: some View {
        VStack {
            Text("탭 2")
                .font(.largeTitle)
            
            Text("EnvironmentObject란??")
                .font(.title)
                .padding()
            
            Text("이 뷰에서는 @EnvironmentObject를 사용해 environment객체에 액세스가 가능하다. ")
                .font(.headline)
                .padding()
            
            Spacer()
            
            Text("탭 1에서 입력한 동물은? ::")
                .padding()
            Text("\(animal.animal)")
                .bold()
            
            Spacer()
        }
    }
}

자세히

  • 특정 상위 뷰에서 .environmentObject를 선택적으로 사용해, 해당 데이터에 액세스할 수 있는 뷰를 제한할 수 있음
  • .environmentObject를 사용하는 부모 뷰의 자식 뷰만 해당 데이터에 액세스 가능
  • .environmentObject를 사용하는 뷰와 관계가 없는 뷰에서는 해당 데이터에 액세스 할 수 없음.

ObservableObject로 데이터 전역 액세스 가능

@main
struct AboutEnvironmentObject: App {
    var body: some Scene {
        WindowGroup {
            EnvironmentObjectGlobalAccess()
                .environmentObject(Animal())
        }
    }
}

루트 뷰에 .environmentObject() 수정자를 사용해 ObservableObject 객체를 전달하면, 앱 내의 모든 계층에서 해당 데이터에 전역적으로 접근이 가능함.

profile
안다고 착각하지 말기

0개의 댓글