본문 바로가기
Ios/Swift UI

부모뷰에서 자식뷰로 상태를 바인딩해서 전달할 때 : $

by 잘먹는 개발자 에단 2024. 7. 26.

보면 ProfileEditor라는 자식 뷰가 있다. 

여기서는 부모에게 Profile 자료형의 어떤 바인딩 상태를 받을 건데, 이걸 어떻게 주냐

struct ProfileEditor: View {
    @EnvironmentObject var displayMode : DarkMode
    
    @State private var counter = 0
    // 부모뷰로부터 profile을 전달받음
    @Binding var profile : Profile
    ..
    .
    .
    .
    .
    .
}

 

 

자식이 @Binding 된 속성을 요구하고 있기 때문에 이 ProfileEditor라는 자식 뷰의 부모뷰인 ProfileHost는 해당 뷰가 가지고 있는 Profile 자료형의 @Binding 을 전달해야한다. 그래야 두 뷰가 상태를 공유하게 된다. 

 

* 여기서 알아두면 좋은 것!

- Swift에서 달러기호 $는 !바인딩!을 의미한다. 

- 상태값 자체가 아니라 그 상태 값에 대한 참조를 전달하는 것이다. 

 

 

import SwiftUI

struct ProfileHost: View {
    @State private var draftProfile = Profile.default
    @Environment(ModelData.self) var modelData
    @Environment(\.editMode) var editMode
    @Environment(\.layoutDirection) var layoutDirection
    
    
    
    var body: some View {
        VStack(alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/, spacing: 20){
            HStack{
                Spacer()
                EditButton()
            }
            
            
            if editMode?.wrappedValue == .inactive{
                ProfileSummary(profile: draftProfile)
            }else{
                ProfileEditor(profile: $draftProfile)
            }
            
        }.padding()
    }
}

#Preview {
    ProfileHost()
        .environment(ModelData())
}

 

이런식으로 전달할거다.