PreferenceKey 프로토콜을 사용하게 되면 부모뷰와 자식 뷰간 소통을 할 수 있습니다.

 

PreferenceKey 는 여러 자식뷰가 있는 부모 뷰가 있을 때 자식들과 부모가 볼 수 있는 단일 값으로 자동으로 결합시켜주는 프로토콜입니다. 쉽게 말해 부모뷰가 자식뷰에서 설정한 값을 감지할 수 있다는 것 입니다.

 

다음 예시는 0부터 100까지의 숫자를 PreferenceKey 프로토콜을 준수하는 구조체의 변수 값으로 넣은 다음 해당 값에 따라 다르게 적용하여 View 에 나타냅니다.

struct NavigationBarTitleKey: PreferenceKey {
  static var defaultValue: String = ""
  static func reduce(value: inout String, nextValue: () -> String) {
    value = nextValue()
  }
}

// 상위뷰
struct ContentView: View {
  var messages: [String] {
    (0...100).map(String.init)
  }
  
  var body: some View {
    NavigationView {
      List(messages, id: \.self) { message in
        NavigationLink {
          SomeView(title: message)
        } label: {
          Text(message)
        }
      }
      .navigationBarTitle("Messages")
    }
  }
}

// 하위뷰
struct SomeView: View {
  let title: String
  
  var body: some View {
    Text(title)
      .navigationBarTitle(title)
      .preference(key: NavigationBarTitleKey.self, value: title)
  }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

'SwiftUI' 카테고리의 다른 글

PhotosPicker  (0) 2023.12.22
Shapes ( Rectangle, RoundedRectangle, Circle, Ellipse, Capsule ...)  (0) 2023.12.20
GeometryReader  (0) 2023.12.19
horizontalSizeClass (make size different layout)  (0) 2023.12.19
Tab View, badge  (0) 2023.12.19
ytw_developer