2

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

这就是我现在在 B 类上所做的事情:

[classA addObserver: self forKeyPath: @"info.name" options: 0 context: nil];

classA 上的值变化有两种方式name:直接设置为likeclassA.info.name = ...info设置为like时classA.info = ...

name直接更改时,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.

我应该在 classA 上进行什么更改才能完成这项工作?

4

2 回答 2

4

此问题的原因来自您正在实现-setInfo:信息的设置器并调用willChangeValueForKey:| didChangeValueForKey:在里面。

我见过很多情况,认为will|didChange...需要执行调用才能触发 KVO 通知。仅当未显式调用 setter 时才如此。当您调用 setter 时,KVO 机制负责触发通知。

大多数情况下,将这些调用留在 setter 中是无害的,只会导致额外的通知,但在这种情况下,它确实会在更新 keypath 时引起问题——而不是 key。

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

于 2013-07-18T04:46:10.683 回答
-1

我认为选项不能为0。

它是一个旧的 API,早在 Apple 致力于 API 设计之前,你必须给它一些东西

于 2012-09-27T16:56:14.950 回答