3个通知而不是一个

时间:2009-11-15 12:33:37

标签: objective-c cocoa notifications key-value-observing

我正在使用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相关联的AppController中的NSImageView

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

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

更新NSImageViewbackgroundImageView类的实例,它是BackgroundImageView的次级。我将后者用于处理作为拖动目标的拖放操作。调用NSImageView时(拖动的最后一个“状态”),它会在performDragOperation:image之间更改setImage属性willChangeValueForKey的值。

3 个答案:

答案 0 :(得分:1)

你的AppController是其他两个笔尖的文件所有者吗?如果是这样,它也将收到每条消息的awakeFromNib消息。 MainMenu加上两个发出三条awakeFromNib消息,这意味着你将自己添加为观察者三次。

答案 1 :(得分:1)

  

...它会在imagesetImage之间更改willChangeValueForKey属性didChangeValueForKey的值。

当您发送访问者消息时,您可以免费获得KVO通知。您应该删除{will,did}ChangeValueForKey:条消息,因为它们至少会导致其中一条无关的更改通知。

答案 2 :(得分:0)

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

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