Middle+
Какво е PreferenceKey в контекста на разработката за iOS?
sobes.tech AI
Отговор от AI
PreferenceKey е протокол в SwiftUI, който позволява предаване на стойности от дъщерни изгледи нагоре по йерархията на изгледите. Използва се за събиране на информация за размери, позиция или други характеристики на дъщерните изгледи, които могат да бъдат използвани в родителските изгледи за вземане на решения за оформление или поведение.
Основни компоненти:
- Ключ (Key): Тип, който реализира протокола
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) }) - Четене на стойност: Родителското изглед чете събраното значение с помощта на модификатора
.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) }
Кога да използвате:
- Получаване на размерите на дъщерните елементи за адаптивно оформление на родителя.
- Предаване на информация за разположението на елементите.
- Създаване на потребителски котви (anchors).
- Събиране на състояние или свойства от няколко дъщерни изгледа.
Разлика от Environment:
Environmentпредава данни надолу по йерархията на изгледите.PreferenceKeyпредава данни нагоре по йерархията и позволява събиране/обединяване на стойности от няколко дъщерни елемента.