当父视图具有日期选择器、SwiftUI 时,不会调用 onPreferenceChange

2023-12-10

我有一个父视图,它有两个子视图。

当子视图更改首选项值时,父视图通过以下方式接收首选项更改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()
  }
}

我也遇到了同样的问题,苹果告诉我这是预料之中的。 我们的错是我们实施了这个reduce()错误地:

static func reduce(value: inout Int, nextValue: () -> Int) {
    value = nextValue()
}

这会用每个视图写入的默认值覆盖视图显式写入的值。因此,您需要重写该函数,以便将其应用于默认值不会产生任何效果,如文档中所述PreferenceKey.defaultValue:

没有显式键值的视图会生成此默认值。组合子视图可能会删除使用默认值生成的隐式值。这意味着reduce(value: &x, nextValue: {defaultValue}) 不应该改变x 的含义。

所以你需要替换这一行:

value = nextValue()

有了这个:

value = max(value, nextValue())

or this:

value += nextValue()

或类似的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当父视图具有日期选择器、SwiftUI 时,不会调用 onPreferenceChange 的相关文章

随机推荐