Middle+
PreferenceKey дар контексти таҳияи iOS чист?
sobes.tech AI
Ҷавоб аз AI
PreferenceKey เป็นโปรโตคอลใน SwiftUI ที่อนุญาตให้ส่งค่าจากมุมมองลูกขึ้นไปตามลำดับชั้นของมุมมอง ใช้สำหรับรวบรวมข้อมูลเกี่ยวกับขนาด ตำแหน่ง หรือคุณสมบัติอื่น ๆ ของมุมมองลูก ซึ่งสามารถนำไปใช้ในมุมมองผู้ปกครองเพื่อการตัดสินใจเกี่ยวกับการจัดวางหรือพฤติกรรม
ส่วนประกอบหลัก:
- กุญแจ (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() // เอาค่าสุดท้าย (ตัวอย่าง) } } - การตั้งค่า: มุมมองลูกตั้งค่าค่าด้วยตัวปรับแต่ง
.preference(key:value:)Text("สวัสดี") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) - การอ่านค่า: มุมมองผู้ปกครองอ่านค่าที่รวบรวมไว้ด้วยตัวปรับแต่ง
.onPreferenceChangeVStack { // มุมมองลูกที่ตั้งค่าความชอบ 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ส่งข้อมูล ขึ้น ไปตามลำดับชั้นของมุมมองและอนุญาตให้รวบรวม/รวมค่าจากหลายมุมมองลูก