Swift UI DatePicker赢得';t更新@ObservedObject值

Swift UI DatePicker赢得';t更新@ObservedObject值,swift,datepicker,swiftui,combine,observedobject,Swift,Datepicker,Swiftui,Combine,Observedobject,我使用一个类来存储@Published变量,但当我试图将在自定义日期选择器上选择的值传递给类中的@ObservedObject时,我收到以下错误: TimePicker(time: self.$time.**timeSelected**) 无法转换“Binding”(aka)类型的值 “Binding”)到预期的参数类型“TimeModel” 如何使用选择器值更新@ObservedObject 完整代码: struct ContentView: View { @Observe

我使用一个类来存储@Published变量,但当我试图将在自定义日期选择器上选择的值传递给类中的@ObservedObject时,我收到以下错误:

TimePicker(time: self.$time.**timeSelected**)
无法转换“Binding”(aka)类型的值 “Binding”)到预期的参数类型“TimeModel”

如何使用选择器值更新@ObservedObject

完整代码:

struct ContentView: View {
    
    @ObservedObject var time = TimeModel()

    var body: some View {

        ZStack{
            VStack{
                TimePicker(time: self.$time.timeSelected)
                
                Text("You chose \(time.timeSelected/60) minutes")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class TimeModel: ObservableObject{
     @Published var timeSelected: TimeInterval = 1.0
}
    

struct TimePicker: UIViewRepresentable {
    
    @ObservedObject var time = TimeModel()
    
    func makeUIView(context: Context) -> UIDatePicker {
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = .countDownTimer
        datePicker.addTarget(context.coordinator,
                             action: #selector(Coordinator.updateTime),
                             for: .valueChanged)
        return datePicker
    }
    
    func updateUIView(_ datePicker: UIDatePicker, context: Context) {
        datePicker.minuteInterval = 5
        datePicker.countDownDuration = time.timeSelected
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject {
        let parent: TimePicker
        
        init(_ parent: TimePicker) {
            self.parent = parent
        }
        
        @objc func updateTime(datePicker: UIDatePicker) {
            parent.time.timeSelected = datePicker.countDownDuration
        }
    }
}
您需要引用相同的
TimeModel
实例

解决方案是将
时间模型
传递给
时间选择器

struct TimePicker: UIViewRepresentable {
    @ObservedObject var time: TimeModel // <- declare only

    ...
}

struct ContentView: View {
    @ObservedObject var time = TimeModel()

    var body: some View {
        ZStack {
            VStack {
                TimePicker(time: time) // <- pass `TimeModel` here

                Text("You chose \(time.timeSelected / 60) minutes")
            }
        }
    }
}

实际上,将默认时间设置为1秒。

谢谢您的快速修复@pawello2222为什么要在TimePicker结构下声明而不是初始化TimeModel?@ThomSides在这两种情况下,您都希望引用相同的
TimeModel
实例,因此只需要创建一次,然后传递。
@Published var timeSelected: TimeInterval = 1.0