티스토리 뷰

이전에 살펴봤던 @State에 이어서 @Binding, @ObservedObject and @EnvironmentObject를 살펴보겠습니다. 

 

@State

뷰가 소유하고 있는 변수입니다.

@State 변수는 영구 저장소를 할당하게 됩니다.

애플은 @State변수가 특정 뷰에게 관리되고 소유되도록  private 하게 선언하도록 합니다.

2020/11/02 - [개발/SwiftUI] - SwiftUI @State살펴보기

 

@Binding

데이터를 저장하는 프로퍼티와 데이터를 표시하고 변경하는 뷰 사이에 연결을 @Binding을 사용해 만들 수 있습니다.

(즉 다른 뷰에서 @State 변수를 바인딩할 수 있습니다.)

@Binding은 데이터의 참조값을 가지고 있기 때문에 @State와 다르게 초기화해주지 않아도 됩니다.

reference로 뷰의 상태를 수정할 수 있습니다.

 

아래와 같이 재생, 중지를 토글링하는 바인딩하는 변수 isPlaying을 만들 수 있습니다.

struct PlayButton: View {
    @Binding var isPlaying: Bool

    var body: some View {
        Button(action: {
            self.isPlaying.toggle()
        }) {
            Image(systemName: isPlaying ? "pause.circle" : "play.circle")
        }
    }
}

앞에 $가 붙은 변수인 isPlaying의 상태를 바인딩하게 됩니다.

struct PlayerView: View {
    var episode: Episode
    @State private var isPlaying: Bool = false

    var body: some View {
        VStack {
            Text(episode.title)
            Text(episode.showTitle)
            PlayButton(isPlaying: $isPlaying)
        }
    }
}

resource: developer.apple.com/documentation/swiftui/binding

 

@ObservedObject

관찰 가능한 오브젝트를 구독하고 관찰 가능한 오브젝트가 변경될 때마다 뷰를 무효화하는 wrapper 타입의 프로퍼티입니다.

objectWillChange를 통해 데이터의 변경을 확인할 수 있습니다.

일반적으로 재사용 가능한 뷰에서는 @State를 사용하지 않습니다.

대신 @Binding이나 @ObservedObject를 사용하는 것이 좋습니다.

resource: developer.apple.com/documentation/swiftui/observedobject

 

@EnvironmentObject 

부모 또는 상위 뷰에서 제공하는 옵저빙 가능한 오브젝트에 대한 wrapper 타입의 프로퍼티입니다.

environment 오브젝트는 관찰 가능한 개체가 변경될 때마다 현재 뷰를 무효화합니다.

environment 오브젝트는 간접적으로 데이터를 전달합니다.

만약 프로퍼티를 environment 오브젝트로 선언한 경우 environmentObject(_: )를 호출해 상위 뷰에서 해당 모델 객체를 설정해야 합니다.

resource: developer.apple.com/documentation/swiftui/environmentobject

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함