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 |