我正在使用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个。你能帮帮我吗?也许我忽略了一些选项或一般注册观察者?
更新:NSImageView
是backgroundImageView
类的实例,它是BackgroundImageView
的次级。我将后者用于处理作为拖动目标的拖放操作。调用NSImageView
时(拖动的最后一个“状态”),它会在performDragOperation:
和image
之间更改setImage
属性willChangeValueForKey
的值。
答案 0 :(得分:1)
你的AppController是其他两个笔尖的文件所有者吗?如果是这样,它也将收到每条消息的awakeFromNib
消息。 MainMenu加上两个发出三条awakeFromNib
消息,这意味着你将自己添加为观察者三次。
答案 1 :(得分:1)
...它会在
image
和setImage
之间更改willChangeValueForKey
属性didChangeValueForKey
的值。
当您发送访问者消息时,您可以免费获得KVO通知。您应该删除{will,did}ChangeValueForKey:
条消息,因为它们至少会导致其中一条无关的更改通知。
答案 2 :(得分:0)
设置观察者似乎没有任何明显的问题。
看看你如何更新你观察到的图像,也许它被修改了3次?