Как использовать ObservedObject с DatePicker в SwiftUI? - PullRequest
0 голосов
/ 05 января 2020

Этот класс получает и отправляет сетевые запросы, обновляя массив таймеров

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]()
...

Это мое представление SwiftUI, здесь я хочу, чтобы указатели даты и переключатель меняли значения, хранящиеся в массиве таймеров, но я не не знаю, как go об этом в SwiftUI, используя timer.start, timer.end и timer.isActive выдает ошибки.

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

1 Ответ

0 голосов
/ 06 января 2020

Решил это, подробно изучив учебник Apple SwiftUI: 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())
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...