我正在使用 Cocoa 绑定(如在 Mac 上的 Objective-C 中)使用值转换器显示相对日期值。也就是说,我的NSValueTransformer
子类将NSDate
实例转换NSString
为显示相对日期,如“3 秒前”、“2 分钟前”等。
如您所见,这些显示的值会随着时间的推移而过时,因此需要以某种方式刷新。我知道我需要使用计时器,然后强制绑定更新,以便重新执行值转换器并显示正确的相对日期。
但问题是,如何使这些绑定刷新它们的值?
我正在使用 Cocoa 绑定(如在 Mac 上的 Objective-C 中)使用值转换器显示相对日期值。也就是说,我的NSValueTransformer
子类将NSDate
实例转换NSString
为显示相对日期,如“3 秒前”、“2 分钟前”等。
如您所见,这些显示的值会随着时间的推移而过时,因此需要以某种方式刷新。我知道我需要使用计时器,然后强制绑定更新,以便重新执行值转换器并显示正确的相对日期。
但问题是,如何使这些绑定刷新它们的值?
如果您正在使用绑定,那么只要您执行以下操作,GUI 就会更新:
因此,如果您已将值绑定到对象的foo.zot
属性,则需要确保调用[foo setZot: @"new value"]
主线程(或使用 设置属性foo.zot=@"new value"
)。
我意识到这个问题很久以前就被问过了,而且对于这种特殊情况,强制 Cocoa-Binding 更新可能不是正确的解决方案,但是当我在寻找一种方法时遇到这个问题时,我认为它是值得在这里发布答案。
您可以通过使绑定对象“认为”某个属性已更改来强制更新,这将促使它通知该属性的任何观察者。这是通过按顺序连续调用两者 willChangeValue
来完成的didChangeValue
,如下例所示:
boundToObject.willChangeValue(forKey: "boundToProperty")
boundToObject.didChangeValue(forKey: "boundToProperty")