Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在变量更新时重新触发函数_Swift_Swiftui_Eventkit - Fatal编程技术网

Swift 如何在变量更新时重新触发函数

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

已更新

我正在使用EventKit从IOS日历中提取事件。工作得很好

下面是检索事件的类函数

@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
作为