Sobes.tech
Назад к вопросам
Junior — Middle
75

Объясните, что такое PreferenceKey и как оно используется в разработке интерфейсов?

Ответ от нейросети

sobes.tech AI

PreferenceKey — это протокол в SwiftUI, который позволяет передавать значения от дочерних вью к родительским, то есть вверх по иерархии вью.

Обычно данные в SwiftUI передаются сверху вниз через свойства, но иногда нужно, чтобы дочерняя вью сообщила родительской какую-то информацию (например, размер, позицию или состояние). Для этого используется PreferenceKey.

Пример использования:

  • Создаётся тип, реализующий PreferenceKey, с определённым типом значения и методом объединения значений.
  • В дочерней вью устанавливается значение через модификатор .preference(key:value:).
  • В родительской вью можно получить это значение через .onPreferenceChange.

Пример кода:

struct MyPreferenceKey: PreferenceKey {
    static var defaultValue: CGFloat = 0
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = max(value, nextValue())
    }
}

struct ChildView: View {
    var body: some View {
        Text("Hello")
            .background(GeometryReader { geo in
                Color.clear.preference(key: MyPreferenceKey.self, value: geo.size.height)
            })
    }
}

struct ParentView: View {
    @State private var height: CGFloat = 0
    var body: some View {
        ChildView()
            .onPreferenceChange(MyPreferenceKey.self) { value in
                self.height = value
            }
    }
}

Таким образом PreferenceKey помогает передавать данные снизу вверх в иерархии SwiftUI.