0

我正在 Cocoa/Objective-C 中开发简单的 MVC 应用程序。我对通知和 KVO 有一个奇怪的问题(或误解)。

我在 MainMenu.xib 中有 AppController 对象,因此我实现awakeFromNib了注册以NSImageView更改其image属性的方法。我通过以下方式添加self为观察者:

// options:3 equals to new/old passed values in changeDictionary
[backgroundImageView addObserver:self 
                      forKeyPath:@"image" 
                         options:3
                         context:NULL];

backgroundImageView是一个连接IBOutlet到的。AppControllerNSImageView

在标准observeValueForKeyPath:ofObject:change:context方法中,我只记录收到的通知。

问题是 - 当我更改image值时,NSImageView我收到 3 个通知而不是 1 个。你能帮我解决这个问题吗?也许我忽略了选项或一般注册观察者中的某些内容?

更新backgroundImageViewBackgroundImageView类的实例,它是NSImageView. 我将后者子类化为处理拖放操作作为拖动目的地。当performDragOperation:被调用时(拖动的最后一个“状态”),它会改变image属性的值setImagebetweenwillChangeValueForKeydidChangeValueForKey

4

3 回答 3

1

您的 AppController 是另外两个 nib 的文件所有者吗?如果是这样,它也会收到awakeFromNib每一个的消息。MainMenu 加 2 会产生 3awakeFromNib条消息,这意味着您将自己添加为观察者 3 次。

于 2009-11-15T13:15:24.373 回答
1

…它用between和改变image属性的值。setImagewillChangeValueForKeydidChangeValueForKey

当您发送访问者消息时,您会免费收到 KVO 通知。您应该删除这些{will,did}ChangeValueForKey:消息,因为它们是至少一个无关更改通知的原因。

于 2009-11-15T19:19:31.787 回答
0

观察者的设置似乎没有任何明显的问题。

看看你如何更新你观察到的图像,也许它被修改了 3 次?

于 2009-11-15T13:58:47.327 回答