【问题标题】:Cocoa bindings: custom setter methods?Cocoa 绑定:自定义设置方法?
【发布时间】:2009-06-09 00:51:50
【问题描述】:

我正在使用 Cocoa 绑定来管理对象表。我了解绑定是如何工作的,但我遇到了一个小问题。管理对象表会很好而且很花哨,除了这些对象必须管理实际的蓝牙硬件。我正在开发一个框架,该框架提供一个表示与该硬件的连接的类,并制作了另一个“管理器”类,使其符合键值。换句话说,这个管理器类必须能够连接并修改其属性字典中的“连接”状态,成为该硬件的代理并修改属性,并根据所做的更改更新硬件。

但是,每当我在对象本身中设置新值时,例如在将“connect”键的值更改为 2(查看)的“connect”方法中(即propertiesDict = newDict),更改似乎没有被它必然会被观察者拾起。我查看了NSKeyValueObservingProtocol 中的observeValueForKeyPath:ofObject:change:context:。但是,我不知道如何处理上下文参数。

我希望这是有道理的......但如果有人有任何想法,我很想听听。

【问题讨论】:

  • 您可能需要向我们展示一些代码。从您的描述中很难弄清楚到底发生了什么。一般来说,符合键值编码的适配器类并不难实现,所以我相信我们可以提供帮助。

标签: cocoa cocoa-bindings key-value-observing


【解决方案1】:

您的问题并不完全清楚,但如果我理解正确,问题可能是因为您需要在更改嵌入对象中的值之前和之后发送手动 KVO 通知。例如,[self willChangeValueForKey:@"connected"];[self didChangeValueForKey:@"connected"];

【讨论】:

  • 我同意。听起来您正在为表示该属性的设置器外部的属性的实例变量分配一个新值。在这种情况下,不会自动发送 KVO 通知。 Cocoa 非常聪明,但还不够聪明,无法识别此分配相当于对键值的更改。您需要使用 willChangeValueForKey: 和 didChangeValueForKey: 将分配给实例变量括起来
【解决方案2】:

可以通过三种方式以兼容 KVO 的方式更新属性/属性:

  1. 使用属性设置器(在@property 声明中指定或由@synthesize 生成)
  2. 在以任何方式更改属性值之前和之后调用-willChangeValueForKey:-didChangeValueForKey:
  3. 致电-setValueForKey:

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多