Sobes.tech
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-ისთვის
    }
}