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

Jupyo's Daily Story

@Binding 본문

SwiftUI

@Binding

JangJupyo 2024. 9. 16. 22:58
728x90
반응형

@Binding은 SwiftUI에서 부모 뷰와 자식 뷰 간에 상태를 공유할 수 있도록 도와주는 프로퍼티 래퍼입니다. @State가 뷰 내부에서 상태를 관리한다면, @Binding은 이 상태를 다른 뷰로 전달하고 공유할 수 있도록 합니다. 즉, @Binding을 사용하면 자식 뷰가 부모 뷰의 상태를 직접 수정할 수 있습니다.

기본 개념

  • 상태 전달: @Binding은 부모 뷰에서 관리되는 @State 변수의 참조를 자식 뷰에 전달합니다. 이를 통해 자식 뷰는 해당 상태를 읽고 수정할 수 있으며, 부모 뷰도 이 변경 사항을 감지하여 UI를 업데이트할 수 있습니다.
  • 양방향 데이터 흐름: @Binding은 데이터가 부모에서 자식으로 전달되는 것뿐만 아니라, 자식에서 부모로도 영향을 미치는 양방향 데이터 바인딩을 가능하게 합니다.

사용 방법

  1. 부모 뷰에서 상태 선언: 부모 뷰에서는 @State로 상태를 선언합니다.
  2. 자식 뷰로 전달: 부모 뷰는 자식 뷰에 @State 변수를 $(바인딩 연산자)를 사용하여 전달합니다.
  3. 자식 뷰에서 @Binding 사용: 자식 뷰는 @Binding으로 부모의 상태를 참조하여 값을 변경하거나 사용할 수 있습니다.

코드 예시

부모 뷰

struct ParentView: View {
    @State private var isOn = false

    var body: some View {
        ToggleView(isToggled: $isOn)
    }
}
  • @StateisOn 변수를 선언하고, ToggleView라는 자식 뷰에 $isOn을 전달합니다. $@State 변수를 @Binding으로 전달하는 것을 의미합니다.

자식 뷰

struct ToggleView: View {
    @Binding var isToggled: Bool

    var body: some View {
        Toggle(isOn: $isToggled) {
            Text("Toggle me!")
        }
    }
}
  • 자식 뷰는 @Binding을 사용하여 부모 뷰로부터 전달받은 상태를 참조합니다. 여기서 isToggled는 부모의 isOn 상태와 동기화됩니다.

주요 특징

  • 양방향 동기화: 자식 뷰에서 @Binding 변수를 수정하면, 부모 뷰의 @State 변수도 동시에 업데이트됩니다. 이로 인해 부모 뷰와 자식 뷰가 상태를 공유하고 동일한 데이터 기반으로 UI를 업데이트할 수 있습니다.
  • 변수의 수정 권한: @Binding은 읽기와 쓰기가 모두 가능합니다. 따라서 자식 뷰에서 해당 값을 수정하면 부모의 상태도 즉시 반영됩니다.
  • 값 전달이 아닌 참조: @Binding은 값 복사가 아닌 참조를 전달합니다. 따라서 부모와 자식이 동일한 메모리 공간에서 값을 공유하는 형태입니다.

@State와의 차이점

  • @State는 해당 뷰가 상태를 직접 관리할 때 사용되며, 뷰 내부에서만 상태가 변경됩니다.
  • @Binding은 다른 뷰에서 관리하는 상태를 참조하고 수정할 수 있도록 해줍니다. 즉, 상태는 부모 뷰에서 관리하고, 자식 뷰에서는 그 상태에 접근만 하도록 하는 것입니다.

실제 사용 예

다음 예시는 ParentView에서 @State로 토글 상태를 관리하고, ToggleView에서 이를 변경할 수 있게 하는 구조입니다.

struct ParentView: View {
    @State private var isOn = false

    var body: some View {
        VStack {
            ToggleView(isToggled: $isOn)
            Text(isOn ? "On" : "Off")
        }
    }
}

struct ToggleView: View {
    @Binding var isToggled: Bool

    var body: some View {
        Toggle(isOn: $isToggled) {
            Text("Toggle me!")
        }
    }
}

이 코드를 실행하면, ToggleView에서 토글을 조작할 때마다 부모 뷰의 텍스트가 업데이트됩니다. 이처럼 @Binding은 자식 뷰에서 상태를 수정하고, 그 변경 사항이 부모 뷰에 실시간으로 반영되도록 해줍니다.

결론

@Binding은 부모와 자식 뷰 간의 상태를 공유하는 데 유용한 도구로, 부모에서 관리되는 상태를 자식 뷰에서 수정할 수 있게 만들어줍니다. 이를 통해 SwiftUI에서는 보다 유연한 상태 관리와 UI 동기화가 가능합니다.

반응형

'SwiftUI' 카테고리의 다른 글

@Published  (0) 2024.09.22
@ObservedObject  (0) 2024.09.21
@StateObject  (0) 2020.10.15
ObservableObject  (0) 2020.10.15
@State  (0) 2020.10.15