【发布时间】:2020-11-29 13:40:51
【问题描述】:
更新
我正在使用 EventKit 从 IOS 日历中提取事件。工作得很好。
这是检索事件的类函数。
@ObservedObject var selectDate = datepicker() // does NOT update as expected.
func loadEvents(completion: @escaping (([EKEvent]?) -> Void)) {
requestAccess(onGranted: {
let startOfDay = Calendar.current.startOfDay(for: self.selectDate.selectedDate)
let endOfDay = Calendar.current.startOfDay(for: self.selectDate.selectedDate.advanced(by: TimeInterval.day))
let predicate = self.eventStore.predicateForEvents(withStart: startOfDay, end: endOfDay, calendars: Array(self.selectedCalendars ?? []))
let events = self.eventStore.events(matching: predicate)
completion(events)
print("loadEvents triggered for \(self.selectDate.selectedDate)") // This ALWAYS returns the current date
}) {
completion(nil)
}
}
我想根据所选日期更新结果。 所以我有一个日期选择器分配给我的主视图中的@ObservedObject var selectDate
@ObservedObject var selectDate = datepicker()
DatePicker(
selection: $selectDate.selectedDate,
in: dateClosedRange,
displayedComponents: [.date, .hourAndMinute], label: { Text("Is hidden label") })
}
这个类充当中间人。 didSet 方法正在触发函数运行,由上面loadEvents func 中的打印语句确认。
class datepicker: ObservableObject {
@Published var selectedDate: Date = Date() {
didSet {
print("class datepicker date changed to \(selectedDate)") // This returns the changed dates correctly
EventsRepository.shared.loadAndUpdateEvents()
}
}
}
我也尝试过这样传递新日期。
let startOfDay = Calendar.current.startOfDay(for: datepicker.init().selectedDate)
只有相同的持久“当前日期”结果。
每当 datePicker 中的 selectDate.selectedDate 发生更改时,如何将新的 selectedDate 传递给函数?
目前它根本没有更新。始终只返回当天的事件。
Debug 中上述代码中包含的打印语句返回。
"class datepicker date changed to 2020-08-13 19:23:28 +0000" // YEP That's right. I used datePicker to select this date.
"loadEvents triggered for 2020-08-10 19:23:28 +0000" // NOT updated, ALWAYS shows current date/time as first run.
所以看起来@Published 属性是一个常量,一旦设置就不能更改。有其他选择吗?
【问题讨论】: