我有一个父视图,它有两个子视图。
当子视图更改首选项值时,父视图通过以下方式接收首选项更改onPreferenceChange
。但是,当父视图具有日期选择器时,onPreferenceChange
不会被调用并停止工作。有没有人找到任何解决方法?
struct parentView: View {
@State private var date = Date()
var body: some View {
VStack{
ChildView1()
Text("Child View 2")
// DatePicker("", selection: self.$date, displayedComponents: .hourAndMinute)
}
.onPreferenceChange(testPreference.self, perform: { value in
print("Printing preference value")
print(value)
})
}
}
struct ChildView1: View {
@State private var tablets : Int = 0
var body: some View {
Text("Child View 1")
.onTapGesture {
self.tablets = self.tablets + 1
}
.preference(key: testPreference.self, value: self.tablets)
}
}
struct testPreference: PreferenceKey {
typealias Value = Int
static var defaultValue: Int = 0
static func reduce(value: inout Int, nextValue: () -> Int) {
value = nextValue()
}
}
Run Code Online (Sandbox Code Playgroud)
Man*_*awa 14
我也遇到了同样的问题,苹果告诉我这是预料之中的。\n我们的错误是我们reduce()
错误地实现了这个:
static func reduce(value: inout Int, nextValue: () -> Int) {\n value = nextValue()\n}\n
Run Code Online (Sandbox Code Playgroud)\n这会用每个视图写入的默认值覆盖视图显式写入的值。因此,您需要重写该函数,以便将其应用于默认值不会产生任何效果,如PreferenceKey.defaultValue文档中所述:
\n\n\n没有显式键值的视图会生成此默认值。组合子视图可能会删除使用默认值生成的隐式值。这意味着reduce(value: &x, nextValue: {defaultValue}) 不应该改变x 的含义。
\n
所以你需要替换这一行:
\nvalue = nextValue()\n
Run Code Online (Sandbox Code Playgroud)\n有了这个:
\nvalue = max(value, nextValue())\n
Run Code Online (Sandbox Code Playgroud)\n或这个:
\nvalue += nextValue()\n
Run Code Online (Sandbox Code Playgroud)\n或类似的东西。
\n 归档时间: |
|
查看次数: |
2143 次 |
最近记录: |