반응형

 

Hacking with Swift 사이트의 강좌 번역본입니다.

 

[원문 : https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-binding-property-wrapper]

 

What is the @Binding property wrapper?

 

@Binding은 SwiftUI에서 적게 사용되는 property wrappers중 하나 이지만, 여전히 엄청 중요합니다: 하나의 값이 실제로 다른곳에서 오고, 두 군데에서 모두 공유되어야 한다고 선언 하는 것입니다. 이것은 참조 타입이 잠재적으로 많은 뷰에서 공유되도록 설계된, @ObservedObject @EnvironmentObject와 같지 않습니다.

 

예를들어, 다음과 같이 자식(child) 뷰가 나타나거나 아닌지를 저장하는 @State property를 가진 ContentView가 있습니다.

struct ContentView: View {
    @State private var showingAddUser = false

    var body: some View {
        VStack {
            // your code here
        }
    }
    .sheet(isPresented: $showingAddUser) {
        // show the add user view
    }
}

 

시트(sheet)의 isPresented 매개변수로 showingAddUser를 사용하며, 해당 Boolean이 true일때 사용자 뷰가 보여질 것입니다. 하지만, 필요한 경우 사용자 추가 뷰가 스스로 해제(dismiss)되도록 하려면 어떻게 해야 할까요? - 예를들어 Done 버튼을 사용자가 누른 경우입니다.

 

우리가 원하는 것은 사용자 추가 뷰에 showingAddUser를 다시 fase로 설정하는 것이며, ContentView가 그것을 숨길수 있을 것입니다. 이것이 @Binding의 정확한 용도입니다: 사용자 추가 뷰에서 이 값은 다른 곳에서 제공될 것이고, 우리와 다른 곳에서 공유될 것입니다라는 property를 만들 수 있습니다.

 

따라서, 다음과 같이 사용자 추가 뷰를 만들수 있습니다.

struct AddView: View {
    @Binding var isPresented: Bool

    var body: some View {
        Button("Dismiss") {
            self.isPresented = false
        }
    }
}

 

해당 property는 글자 그대로 isPresented라는 Boolean 값이 있지만, 다른 곳에 저장되어 있습니다. 따라서, 이전에 있던 주석 // show the add user view부분을 바꿔서 AddView를 만들때, 값을 제공해야 하므로 그것을 조작할 수 있습니다.

.sheet(isPresented: $showingAddUser) {
    AddView(isPresented: self.$showingAddUser)
}

 

ContentView AddView 모두 같은 Boolean 값을 공유합니다 - 한 곳에서 변경하면 다른 곳에도 변경됩니다.

반응형
Posted by 까칠코더
,