Swift UI DatePicker не обновляет значение @ObservedObject

Я использую класс для хранения переменной @Published, но когда я пытаюсь передать значение, выбранное в моем настраиваемом DatePicker, в @ObservedObject в классе, я получаю следующую ошибку:

TimePicker(время: self.$ Time.TimeSelected)

Cannot convert value of type 'Binding<TimeInterval>' (aka 'Binding<Double>') to expected argument type 'TimeModel'

Как мне обновить @ObservedObject значением средства выбора?

ПОЛНЫЙ КОД

import SwiftUI
    
    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
            }
        }
    }

1 ответ

Решение

Вы должны сослаться на то же самое TimeModel пример.

Решение - передать TimeModel к TimePicker:

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")
            }
        }
    }
}

Обратите внимание, что TimeIntervalуказывает время в секундах, а не в минутах.

Эта строка:

@Published var timeSelected: TimeInterval = 1.0

фактически устанавливает время по умолчанию на 1 секунду.

Другие вопросы по тегам