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 үчүн бекитилген рамка
}
}