Sobes.tech
Middle+

SwiftUI контекстинде PreferenceKey эмне?

sobes.tech AI

AIден жооп

PreferenceKey — бул SwiftUIдеги протокол, ал аркылуу көрүнүш дарагында "төмөндөн жогору" маанилер өткөрүлөт. Ал балдар көрүнүштөрдөн маалымат чогултуу жана аны ата-энелерге жеткирүү үчүн колдонулат, алар бул маалыматты өзүнүн жүрүм-турумуна же көрүнүшүнө өзгөртүү киргизүү үчүн пайдалана алышат.

PreferenceKeyтин негизги өзгөчөлүктөрү:

  • Протокол: PreferenceKey протоколун ишке ашырышыңыз керек, маанинин түрүн жана маанилерди бириктирүү ыкмасын аныктоо менен.
  • associatedtype Value: Жөнөтүлүүчү маалыматтардын түрүн аныктайт.
  • static func reduce(value: inout Value, nextValue: () -> Value): Бул ыкма SwiftUI тарабынан бир нече балдар көрүнүштөрдөн маанилер чогултулганда чакырылат. Текшерип, учурдагы маанини (value) жана жаңы маанини (nextValue()) кантип бириктирүү керектигин аныктоо керек.
  • Маалыматтарды өткөрүү: Балдар көрүнүштөр .preference(key:value:) модификаторун колдонуп, конкреттүү PreferenceKey үчүн маанини белгилешет.
  • Маалыматты окуу: Ата-энелер .onPreferenceChange(_:perform:) модификаторун колдонуп, маанинин өзгөрүшү тууралуу кабар алышат.

Мисал:

Балдар көрүнүшүнүн бийиктигин аныктоо үчүн PreferenceKey түзүү:

struct ChildHeightPreferenceKey: PreferenceKey {
    // Маанинин түрү — Опционалдуу Double, анткени балдар көрүнүшү дагы өлчөмдөргө ээ болбой калышы мүмкүн
    typealias Value = Double?

    // Баштапкы мааниси
    static var defaultValue: Double? = nil

    // Маалыматтарды бириктирүү (бул учурда акыркы бош эмес маанини алабыз)
    static func reduce(value: inout Double?, nextValue: () -> Double?) {
        value = nextValue() ?? value
    }
}

Көрсөтмөдө колдонуу:

struct ParentView: View {
    @State private var childHeight: Double? = nil

    var body: some View {
        VStack {
            Text("Балдар көрүнүшүнүн бийиктиги: \(childHeight != nil ? "\(childHeight!)" : "-")")
            ChildView()
                // Маалыматты окуу
                .onPreferenceChange(ChildHeightPreferenceKey.self) { newValue in
                    self.childHeight = newValue
                }
        }
    }
}

struct ChildView: View {
    var body: some View {
        GeometryReader { geometry in
            Rectangle()
                .fill(Color.blue)
                .frame(height: 100) // Мисал бийиктик
                // Маалыматты белгилөө
                .preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
        }
        .frame(height: 100) // GeometryReader үчүн бекитилген рамка
    }
}