Sobes.tech
Middle+

PreferenceKey дар контексти таҳияи iOS чист?

sobes.tech AI

Ҷавоб аз AI

PreferenceKey เป็นโปรโตคอลใน SwiftUI ที่อนุญาตให้ส่งค่าจากมุมมองลูกขึ้นไปตามลำดับชั้นของมุมมอง ใช้สำหรับรวบรวมข้อมูลเกี่ยวกับขนาด ตำแหน่ง หรือคุณสมบัติอื่น ๆ ของมุมมองลูก ซึ่งสามารถนำไปใช้ในมุมมองผู้ปกครองเพื่อการตัดสินใจเกี่ยวกับการจัดวางหรือพฤติกรรม

ส่วนประกอบหลัก:

  1. กุญแจ (Key): ชนิดที่ implements โปรโตคอล PreferenceKey กำหนดชนิดของค่าที่จะส่งผ่าน และวิธีการรวมค่าหลายค่า (reduce เมธอด)
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // ค่าดีฟอลต์
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // ลอจิกการรวมค่าที่อยู่ในนี้
            // ในกรณีนี้ สามารถเลือกขนาดสูงสุดหรือบวกกันได้
            // ตัวอย่าง: value = max(value, nextValue())
            // ตัวอย่างสำหรับการบวก: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // เอาค่าสุดท้าย (ตัวอย่าง)
        }
    }
    
  2. การตั้งค่า: มุมมองลูกตั้งค่าค่าด้วยตัวปรับแต่ง .preference(key:value:)
    Text("สวัสดี")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. การอ่านค่า: มุมมองผู้ปกครองอ่านค่าที่รวบรวมไว้ด้วยตัวปรับแต่ง .onPreferenceChange
    VStack {
        // มุมมองลูกที่ตั้งค่าความชอบ
        Text("ตัวอย่าง 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("ตัวอย่างยาว")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // ที่นี่สามารถใช้ขนาดที่รวมกันได้
        print("ขนาดรวม:", size)
    }
    

เมื่อไหร่ควรใช้:

  • การรับขนาดขององค์ประกอบลูกเพื่อการจัดวางแบบปรับตัวของผู้ปกครอง
  • การส่งข้อมูลเกี่ยวกับตำแหน่งขององค์ประกอบ
  • การสร้าง anchor แบบกำหนดเอง
  • การรวบรวมสถานะหรือคุณสมบัติจากหลายมุมมองลูก

ความแตกต่างจาก Environment:

  • Environment ส่งข้อมูล ลง ไปตามลำดับชั้นของมุมมอง
  • PreferenceKey ส่งข้อมูล ขึ้น ไปตามลำดับชั้นของมุมมองและอนุญาตให้รวบรวม/รวมค่าจากหลายมุมมองลูก