Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use ObservedObject with DatePicker in SwiftUI?

This class receives and send network requests updating the timers array

struct ScheduleTimer: Identifiable {
    var id: Int
    var name: String
    @State var start: Date
    @State var end: Date
    @State var isActive: Bool
}

class ScheduleController: ObservableObject, NetworkDelegate {

    var didChange = PassthroughSubject<Void, Never>()

    @Published var timers = [ScheduleTimer]()
...

This is my SwiftUI view in here I want the date pickers and the toggle to change the values kept in the timers array but I don't know how to go about that in SwiftUI, using timer.start, timer.end and timer.isActive throws errors.

struct ScheduleView: View {
    @ObservedObject var scheduleController = ScheduleController()

    var body: some View {
        NavigationView {
            Form {
                ForEach(scheduleController.timers) { timer in
                    Section(header: Text(timer.name)){
                        DatePicker("From", selection: timer.start, displayedComponents: .hourAndMinute)
                        DatePicker("To", selection: timer.end, displayedComponents: .hourAndMinute)
                        Toggle(isOn: timer.isActive) {
                            Text("")
                        }.toggleStyle(DefaultToggleStyle())
                    }
                }
            }
        }
    }
}
like image 289
Watermamal Avatar asked Sep 19 '25 14:09

Watermamal


1 Answers

Solved it by taking an extensive look at Apple's SwiftUI tutorial: https://developer.apple.com/tutorials/swiftui/handling-user-input

struct ScheduleTimer: Identifiable {
    var id: Int
    var name: String
    var start: Date
    var end: Date
    var isActive: Bool
}

struct ScheduleView: View {
    @ObservedObject var scheduleController = ScheduleController()

    var body: some View {
        NavigationView {
            Form {
                ForEach(scheduleController.timers) { timer in
                    ScheduleForm(scheduleController: self.scheduleController, timer: timer)
                }
            }
        }
    }
}


struct ScheduleForm: View {
    @ObservedObject var scheduleController: ScheduleController
    var timer: ScheduleTimer
    var scheduleIndex: Int {
        scheduleController.timers.firstIndex(where: { $0.id == timer.id })!
    }
    @State var start = Date()
    var body: some View {
        Section(header: Text(self.scheduleController.timers[scheduleIndex].name)){
            DatePicker("From", selection: self.$scheduleController.timers[scheduleIndex].start, displayedComponents: .hourAndMinute)
            DatePicker("To", selection: self.$scheduleController.timers[scheduleIndex].end, displayedComponents: .hourAndMinute)
            Toggle(isOn: self.$scheduleController.timers[scheduleIndex].isActive) {
                Text("")
            }.toggleStyle(DefaultToggleStyle())
        }
    }
}
like image 76
Watermamal Avatar answered Sep 21 '25 16:09

Watermamal