我正在尝试使用 Preferences 将数据传递到视图链,但从未调用 .onPreferenceChange 。经过一番调查后发现,虽然调试器显示执行通过了我的 .Preference 修饰符,但从未调用reduce 方法将新值推入键中。我无法弄清楚为什么,也无法找到检查视图的首选项键:值数据的方法。
这是代码:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
这是单元格视图,点击 QGrid 中的 GlyphCell 实例即可设置 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
}
Run Code Online (Sandbox Code Playgroud)
在 .pref(key:...) 上设置断点后,每次点击单元格时都会触发断点,并且 self.glyph.Gardiner 的值在该点是正确的。
绝不会触发 Preference Key Struct“reduce”函数中的断点或测试 Print 语句。由于 .onPrefChange 永远不会被触发,我必须假设 Value 永远不会改变,但我无法直接查看 Pref 值。
到底是怎么回事?
reduce
当您在一个视图层次结构中多次设置一个首选项键时,会调用 ,因此 SwiftUI 使您可以以某种方式组合它们,例如:
.previewLayout(.sizeThatFits)
.preference(key: LittleTapPrefKey.self, value: value1) // 1st time
.background(Group {
if self.selected {
Color.clear
.preference(key: LittleTapPrefKey.self, value: value2) // 2nd time
}
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您只有一个值设置器,因此它只是设置并且.onPreferenceChange(LittleTapPrefKey.self)
回调修饰符按预期工作。
使用 Xcode 11.4 / iOS 13.4 进行测试
归档时间: |
|
查看次数: |
2562 次 |
最近记录: |