Objective c KVO产生错误/未收到通知

Objective c KVO产生错误/未收到通知,objective-c,key-value-observing,Objective C,Key Value Observing,我有一个类(称之为classA),它包含一个名为info的属性(一个模型类,包含大量信息),而这个模型类又包含一个名为name的属性(一个字符串)。我希望另一个类(classB)在classA中字符串name更改时接收KVO通知 这就是我现在在B班所做的: [classA addObserver: self forKeyPath: @"info.name" options: 0 context: nil]; 有两种方式可以更改classA上的值name:直接将其设置为classA.info.n

我有一个类(称之为classA),它包含一个名为
info
的属性(一个模型类,包含大量信息),而这个模型类又包含一个名为
name
的属性(一个字符串)。我希望另一个类(classB)在classA中字符串
name
更改时接收KVO通知

这就是我现在在B班所做的:

[classA addObserver: self forKeyPath: @"info.name" options: 0 context: nil];
有两种方式可以更改classA上的值
name
:直接将其设置为
classA.info.name=…
和将
info
设置为
classA.info=…

名称
被直接更改时,KVO可以完美地工作。但是,当设置了
info
属性并且
name
间接更改时,我会出现以下错误:

Cannot update for observer <classB> for the key path "info.name" from <classA>, most likely because the value for the key "info" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the classA class.
无法为观察员更新来自的密钥路径“info.name”,很可能是因为密钥“info”的值已更改,但未发送适当的KVO通知。检查classA类的KVO遵从性。

我应该在classA上更改什么才能使其工作?

我认为选项不能为0


这是一个旧的API,早在苹果开始认真研究API设计之前,你就必须给它一些东西。

这个问题的原因在于你正在为信息实现setter
-setInfo:
并在其中调用
willChangeValueForKey:
didChangeValueForKey:

我看到过许多实例,其中认为需要实现
将| didChange…
调用才能触发KVO通知。只有在未显式调用setter时才是这样。当您调用setter时,KVO机制负责触发通知

大多数情况下,将这些调用留在setter中是无害的,只会导致额外的通知,但正如在本例中所看到的,它确实会在更新键路径(而不是键路径)时导致问题


简而言之,如果您确实实现了setter,请不要在其内部调用
will | didChangeValueForKey:

您是否实现了此模型类,如果是这样,请在更改属性之前和之后调用
willChangeValueForKey:
。@特洛伊木马
name
由基于视图的tableview直接设置,使用绑定,所以我什么都做不了<代码>信息由我设置,我不会这么做。我试过你刚才说的话,但还是不管用。同样的错误。哦,顺便说一句,我创建了这个模型类(classA),它显示了您用来更新
name
属性的代码。@特洛伊木马
name
绑定到tableview中的一个文本字段。也许您指的是更改
info
属性的代码?这里:
[classA setInfo:newInfo]
这正是您所期望的。您可以将
will/didChangeValueForKey:@“info.name”
在此之前和之后?根据文档:
NSKeyValueObservingOptions,这些常量将传递给addObserver:forKeyPath:options:context:并确定作为传递给对象的observeValueForKeyPath:change:context:的更改字典的一部分返回的值。如果不需要更改字典值,则可以传递0。
谢谢。我猜那是一只老虫子吧我以前让KVO在将选项从0更改为。。。任何位掩码选项之一。一直都很好。也许删除这个答案?这是我的案例的正确答案。我有大量绑定,其中一些绑定通过路径连接,而不仅仅是键。评论出遗嘱| didChange。。。二传手内部的呼叫成功了!