Middle+
რა არის PreferenceKey SwiftUI-ის კონტექსტში?
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-ისთვის
}
}