2009-11-15 2 views
0

나는 Cocoa/Objective-C에서 간단한 MVC 애플리케이션을 개발 중이다. 알림 및 KVO에 이상한 문제가 있거나 오해가 있습니다.하나 대신 3 개의 알림

저는 MainMenu.xib에 AppController 객체가 있습니다. 따라서 NSImageViewimage 속성을 등록 할 때 awakeFromNib 메서드를 구현합니다. 나는 다음과 같은 방법으로 관찰자로 self을 추가

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

backgroundImageViewNSImageView에 연결 AppControllerIBOutlet입니다.

표준 observeValueForKeyPath:ofObject:change:context 방법에서는 수신 된 알림 만 로깅합니다.

문제가 있습니다 - 값을 NSImageView으로 변경하면 하나 대신 3 개의 알림이 표시됩니다. 이걸로 나를 도울 수 있니? 아마도 옵션이나 관찰자를 일반적으로 등록 할 때 뭔가를 간과 할 수 있습니까?

UPDATE : backgroundImageViewNSImageView의 sublcass입니다 BackgroundImageView 클래스의 인스턴스입니다. 끌기 대상으로 끌어서 놓기 작업을 처리하기위한 후자의 하위 클래스를 작성했습니다. performDragOperation:이 호출되면 (끌기의 마지막 '상태') 속성의 값이 setImage 인 값이 willChangeValueForKeydidChangeValueForKey 사이에서 변경됩니다.

+2

숫자 리터럴 대신 항상 기호 상수를 사용해야합니다. 새로운 값과 이전 값을 모두 원한다면, 그 플래그의 비트 OR을 지정하십시오 :'NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld' –

+0

변경 사전을 기록하면 어떤 출력이 나옵니까? (질문을 편집하여 출력을 포함 시키십시오.) –

답변

1

... 그것은 willChangeValueForKeydidChangeValueForKey 사이 setImageimage와 속성에 대한 값을 변경한다.

접근 자 메시지를 보내면 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와 2는 세 개의 awakeFromNib 메시지를 만듭니다. 즉, 자신을 관찰자로 세 번 추가합니다.

+0

AppController는 MainMenu.xib의 객체입니다. 파일 소유자가 아닙니다. – Eimantas

0

관찰자의 설정에 명백한 문제가없는 것 같습니다.

관찰 한 이미지를 어떻게 업데이트했는지, 어쩌면 3 번 수정 되었습니까?

+0

질문을 필요한 세부 사항으로 업데이트했습니다. – Eimantas

+0

Eimantas : 변경 사항을 저장 했습니까? 편집을 보여주지 않습니다. –

+0

새로 고침! 업데이트를 작성하기 전에 주석을 썼습니다.) – Eimantas

관련 문제