2009-11-15 2 views
0

Я разрабатываю простое приложение MVC в Cocoa/Objective-C. У меня странная проблема (или недоразумение) с уведомлениями и KVO.3 уведомления вместо одного

У меня есть объект AppController в MainMenu.xib, поэтому я реализую метод awakeFromNib, где я зарегистрируюсь для NSImageView, изменяя его image. Добавить self в качестве наблюдателя следующим образом:

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

backgroundImageView в AppControllerIBOutlet подключен к NSImageView.

В стандарте observeValueForKeyPath:ofObject:change:context метод Я просто зарегистрировал полученное уведомление.

Проблема: при изменении значения imageNSImageView У меня есть 3 уведомления вместо одного. ты можешь помочь мне с этим? Может быть, я пропускаю что-то в вариантах или вообще регистрирую наблюдателя?

UPDATE: backgroundImageView является экземпляром класса BackgroundImageView, который sublcass из NSImageView. Я подклассифицировал последний для обработки операций перетаскивания в качестве места назначения перетаскивания. Когда вызывается performDragOperation: (последнее «состояние» перетаскивания), он изменяет значение для image с setImage между willChangeValueForKey и didChangeValueForKey.

+2

Вы должны всегда использовать символические константы вместо числовых литералов. Если вы хотите как новые, так и старые значения, укажите побитовое ИЛИ этих флагов: 'NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld' –

+0

Какой результат вы получаете, если вы заходите в словарь изменений? (Пожалуйста, отредактируйте свой вопрос, чтобы включить вывод.) –

ответ

1

... он изменяет значение image собственности с setImage между willChangeValueForKey и didChangeValueForKey.

Когда вы отправляете сообщение о доступе, вы получаете бесплатно уведомления KVO. Вы должны удалить сообщения {will,did}ChangeValueForKey:, потому что они являются причиной хотя бы одного из посторонних уведомлений об изменении.

+0

Я не уверен, почему любой из '{will, did} ChangeValueForKey:' вызывает уведомление KVO, я предполагаю, что только эти методы не изменяют свойство 'image' представления, они только предоставляют пути для расширенного класса, чтобы отключить изменение или сделать некоторую дополнительную работу, когда значение изменилось, есть ли у вас какая-либо конкретная причина или пример? – stefanB

+0

Публикация уведомлений KVO (без аксессуаров) является самой целью '{will, did} ChangeValueForKey'. Когда у вас есть аксессор, и вы его используете, KVO отправляет эти сообщения для вас. –

+0

См. Соответствующий раздел руководства по программированию KVO: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueObserving/Concepts/AutoVsManual.html –

1

Является ли ваш AppController владельцем файла двух других перьев? Если это так, он получит сообщение awakeFromNib для каждого из них. MainMenu plus two делает три сообщения awakeFromNib, что означает, что вы добавите себя в качестве наблюдателя три раза.

+0

AppController - это объект в MainMenu.xib. Это не владелец файла. – Eimantas

0

Кажется, что нет никакой очевидной проблемы с установкой наблюдателя.

Посмотрите, как вы обновляете изображение, которое вы наблюдаете, возможно, оно изменяется 3 раза?

+0

Я обновил вопрос с помощью необходимых деталей. – Eimantas

+0

Eimantas: Вы уверены, что сохранили изменения? Это не показывает мне редактирование. –

+0

Обновить! Я написал комментарий перед тем, как писать обновления.) – Eimantas

Смежные вопросы