Swift 如何在变量更新时重新触发函数
已更新 我正在使用EventKit从IOS日历中提取事件。工作得很好 下面是检索事件的类函数Swift 如何在变量更新时重新触发函数,swift,swiftui,eventkit,Swift,Swiftui,Eventkit,已更新 我正在使用EventKit从IOS日历中提取事件。工作得很好 下面是检索事件的类函数 @ObservedObject var selectDate = datepicker() // does NOT update as expected. 我想根据选择的日期更新结果。 因此,我在主视图中为@ObservedObject varselectDate分配了一个日期选择器 @ObservedObject var selectDate = datepicker() 这个班是中间人。didS
@ObservedObject var selectDate = datepicker() // does NOT update as expected.
我想根据选择的日期更新结果。
因此,我在主视图中为@ObservedObject varselectDate分配了一个日期选择器
@ObservedObject var selectDate = datepicker()
这个班是中间人。didSet
方法正在触发函数运行,由上面的loadEvents
func中的print语句确认
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)
只有相同的持久“当前日期”结果
当日期选择器中的selectedDate.selectedDate更改时,如何将新的selectedDate传递给函数
目前它根本没有更新。始终仅返回当天的事件
上述代码中包含的print语句将返回调试
"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属性是一个常量,一旦设置就不能更改。还有别的选择吗
当
selectDate。是否更改日期选择器中的selectedDate
您可以尝试使用didSet
:
class datepicker: ObservableObject{
@Published var selectedDate: Date = Date() {
didSet {
// loadEvents()
}
}
}
使用Xcode 11.6、iOS 13.6进行测试
编辑 看起来您正在使用两个
datepicker
对象的实例。确保在所有相关位置使用相同的实例
此对象只能创建一次:
@ObservedObject var selectDate = datepicker()
然后传递到init
中的其他位置
当
selectDate。是否更改日期选择器中的selectedDate
您可以尝试使用didSet
:
class datepicker: ObservableObject{
@Published var selectedDate: Date = Date() {
didSet {
// loadEvents()
}
}
}
使用Xcode 11.6、iOS 13.6进行测试
编辑 看起来您正在使用两个
datepicker
对象的实例。确保在所有相关位置使用相同的实例
此对象只能创建一次:
@ObservedObject var selectDate = datepicker()
然后传递到
init
中的其他位置,一种方法是在创建模型对象时实际订阅您自己的发布者
类日期管理器:ObservableObject{
@已发布的变量selectedDate:Date=.init()
私有变量包:Set=[]
init(){
$selectedDate//$prefix从`Published`中获取预计值,即`Publisher``
.receive(在:DispatchQueue.main上)
.sink{[弱自]选择日期为
self?.loadEvents(日期:selectedDate)
}
.存储(在:&袋中)
}
}
这将订阅该发布服务器,并在其更改时触发API调用。如果用户正在快速更改日期等,您可以选择添加
debounce
或小延迟。现在,您完全可以使用combine来控制此数据流。一种方法是,在创建模型对象时实际订阅您自己的发布者
类日期管理器:ObservableObject{
@已发布的变量selectedDate:Date=.init()
私有变量包:Set=[]
init(){
$selectedDate//$prefix从`Published`中获取预计值,即`Publisher``
.receive(在:DispatchQueue.main上)
.sink{[弱自]选择日期为
self?.loadEvents(日期:selectedDate)
}
.存储(在:&袋中)
}
}
这将订阅该发布服务器,并在其更改时触发API调用。如果用户正在快速更改日期等,您可以选择添加<代码>去抖动代码>或小延迟。现在,您完全可以使用联合收割机来控制此数据流。这肯定行不通。这里的实际类型是
Published
,属性包装器,从技术上讲,它永远不会被设置。@拖拉8不,你错了。请在操场上运行我的代码(你可以在didSet
上print
),看看会发生什么。我知道联合收割机方式在您看来可能更好,但请不要批评我的解决方案,除非先对其进行测试。我可以用print语句确认didSet
方法正在触发函数运行。但新选择的日期并未传递给这些职能部门。因此,正如@prolalist8所暗示的那样,Published
似乎是一次性交易。我已经看过了另一个提议的解决方案,但是没有正确地实现它(我是一个新手,所以这肯定是我的失败),但是当didSet
正在完成触发函数的工作时,唯一剩下的问题就是过了新的日期。除了发布的还有其他选择吗?@my4很难说清楚你在做什么。您可以尝试将selectedDate
作为参数传递给loadEvents
。@pawello2222谢谢,我已经更新了问题,以便更好地显示发生了什么。这肯定行不通。这里的实际类型是Published
,属性包装器,从技术上讲,它永远不会被设置。@拖拉8不,你错了。请在操场上运行我的代码(你可以在didSet
上print
),看看会发生什么。我知道联合收割机方式在您看来可能更好,但请不要批评我的解决方案,除非先对其进行测试。我可以用print语句确认didSet
方法正在触发函数运行。但新选择的日期并未传递给这些职能部门。因此,正如@prolalist8所暗示的那样,Published
似乎是一次性交易。我已经看过了另一个提议的解决方案,但是没有正确地实现它(我是一个新手,所以这肯定是我的失败),但是当didSet
正在完成触发函数的工作时,唯一剩下的问题就是过了新的日期。除了发布的还有其他选择吗?@my4很难说清楚你在做什么。您可以尝试将selectedDate
作为