Я пытаюсь передать данные в цепочку представлений с помощью Preferences, но .onPreferenceChange никогда не вызывается. Небольшое расследование показывает, что хотя отладчик показывает, что выполнение проходит через мой модификатор .Preference, метод reduce никогда не вызывается для pu sh нового значения в ключе. Я не могу понять, почему, и при этом я не могу найти способ исследовать ключ предпочтения Представления: значение данных.
вот код:
struct LittleTapPrefKey: PreferenceKey {
typealias Value = String
static var defaultValue: Value = "A0"
static func reduce(value: inout Value, nextValue: () -> String) {
print("Inside Little Reduce \(value)and NextVal = \(nextValue())")
value = nextValue()
}
}
здесь - ячейка. для экземпляра GlyphCell в QGrid установлен модификатор Pref:
struct GlyphCell: View {
var glyph:Glyph
@State private var selected = false // << track own selection
var body: some View {
ZStack {
Text("\(glyph.Hieroglyph)")
.lineLimit(1)
.padding(.all, 12.0)
.font(.system(size: 40.0))
.background(Color.yellow)
Text("\(glyph.Gardiner)")
.offset(x: 12, y: 28)
.foregroundColor(.blue)
}.onTapGesture {
print("Tap on \(self.glyph.Gardiner)")
self.selected.toggle()
}
.cornerRadius(6.0)
.frame(width: 90.0, height: 100.0, alignment: .center)
.previewLayout(.sizeThatFits)
.background(Group {
if self.selected {
Color.clear
.preference(key: LittleTapPrefKey.self, value: self.glyph.Gardiner)
} // end selected test
} // end group
) // end .background
} // end cell body view
}
с точкой останова, установленной в .pref (key: ...), точка останова срабатывает при каждом касании ячейки, и значение self.glyph.Gardiner является правильным в этой точке.
Точки останова или тестовый оператор Print в структуре Preference Key Struct «уменьшить» никогда не срабатывают. Поскольку .onPrefChange никогда не запускается, я должен предположить, что значение никогда не изменяется, но у меня нет возможности напрямую просмотреть значение Pref.
Что происходит?