如何强制更新Cocoa绑定?

时间:2013-03-18 15:33:04

标签: objective-c macos cocoa cocoa-bindings

我正在使用Cocoa绑定(如在Mac上的Objective-C中)使用值转换器显示相对日期值。也就是说,我的NSValueTransformer子类将NSDate实例转换为NSString以显示相对日期,例如“3秒前”,“2分钟前”等等。

正如您所看到的,这些显示的值随着时间的推移而过时,因此需要以某种方式刷新。我知道我需要使用计时器,然后强制更新绑定,以便重新执行值转换器并显示正确的相对日期。

但问题是,如何使这些绑定更新其值?

2 个答案:

答案 0 :(得分:5)

如果您正在使用绑定,那么GUI应该只要您更新:

  • 正在更新主线程上的值(因此绑定可以在GUI时更新)
  • 正在使用setter更新值

因此,如果您已将值绑定到对象的foo.zot属性,则需要确保在主线程上调用[foo setZot: @"new value"](或使用{{设置属性) 1}})。

答案 1 :(得分:0)

我意识到这个问题是很久以前提出的,而且对于这种特殊情况,强制执行Cocoa-Binding更新可能不是正确的解决方案,但是当我在寻找解决方法时遇到了这个问题,我认为在这里发布答案是值得的。

您可以通过使绑定对象“认为”属性已更改来强制进行更新,这将促使它通知任何观察者该属性。可以通过依次按以下顺序依次调用两者 willChangeValuedidChangeValue来完成,如下例所示:

boundToObject.willChangeValue(forKey: "boundToProperty")
boundToObject.didChangeValue(forKey: "boundToProperty")