2011-08-28 2 views
0

설명서를 올바르게 읽은 경우 개체는 (대다 관계라고도하는) 인덱싱 된 속성에 대한 관찰자로 등록 할 수 있습니다. 보통의 스칼라 속성.코코아 - KVO 및 인덱스 된 속성에 대한 자동 알림

나는 인덱싱 된 접근자를 구현했으며 배열 컨트롤러가 테이블보기를 채우기 위해이 배열을 사용하고 변경할 수있는 프록시 배열이이를보고 사용하기 때문에 배열 된 접근자를 구현했습니다. 이들의 프로토 타입은 다음과 같다 :

// Make indexable accessors for data: 
- (NSUInteger)countOfData; 
- (id)objectInDataAtIndex:(NSUInteger)index; 
- (NSArray *)dataAtIndexes:(NSIndexSet *)indexes; 
- (void)insertObject:(NSDictionary *)dict inDataAtIndex:(NSUInteger)index; 
- (void)insertData:(NSArray *)dataArray atIndexes:(NSIndexSet *)indexes; 
- (void)removeObjectFromDataAtIndex:(NSUInteger)index; 
- (void)removeDataAtIndexes:(NSIndexSet *)indexes; 

나는 NSDocument는 다음과 같은 방법으로 수신하도록 등록 : 실제로이의 문서에 구체적인 예를 본 적이 없다

[self addObserver:self 
     forKeyPath:@"data" 
      options:(NSKeyValueObservingOptionNew | 
        NSKeyValueObservingOptionOld | 
        NSKeyValueObservingOptionInitial | 
        NSKeyValueObservingOptionPrior) 
      context:dataArrayChange]; 

하지만 페이지

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW3

그래서 내 질문은 : 다음을 얻을 수있는 방법이있다 (아래)을 향해 아래로 수동으로 작업을 수행하는 방법에 대한 예제가있다 자동으로 알림을 받거나 문서의 예와 같이 수동으로해야합니까?

편집 추가 :

첫째, 문맥의 비트 -이 NSDocument가 (각 객체가 사전 인) 데이터 인덱스 속성, 어레이 컨트롤러를 보유하는 매우 간단한 NSDocument 기반 애플리케이션에 대해 인 데이터 속성에 바인딩되고 테이블보기에 데이터가 표시됩니다. 알림을 원하는 이유는 실행 취소를 구현하려는 것이고 알림이 작동하면 모든 것이 잘 작동한다는 것입니다.

둘째로 -init 메서드의 dataProxy = [[self mutableArrayValueForKey:@"data"] retain]; 호출로 만든 프록시를 통해 데이터에 액세스 할 때 문제가 발생합니다.

내가 프록시에 사용한 호출은 다음과 같습니다

[dataProxy addObject: <an object>] 

이 접근 예상하지만 알림을 생성하지 않는 insertData:atIndexes: 호출합니다. 이런 내가 직접 호출하는 경우

:

예상 및 자동 알림을 생성하는대로 작동
[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]]; 

.

위의 두 메소드 모두 동일한 접근자를 호출하며 나에게 영향을 미치는 미묘한 세부 사항이있을 수 있습니다.

마지막으로 배열 컨트롤러가 접근자를 호출하고 알림이 생성됩니다.

+0

아마도 관련 : http://stackoverflow.com/q/19932947/390581 첫 번째 관찰자가 등록 된 후 ** mutableArrayValueForKey :'**를 사용하여 프록시를 만들어야합니다. –

+0

@ Jean-PhilippePellet 질문과 답변에 대한 정보가 많아서 중복으로 투표를 마감 할 것입니다. 같은 일을해도 좋습니다! – Monolo

답변

1

관측자를 수동으로 관리하는 것에 대해 걱정할 필요가 없습니다. 접근자를 인덱싱하면 KVO 알림이 자동으로 게시됩니다.

관찰 된 속성의 변경 사항을 알리기 위해 observeValueForKeyPath:ofObject:change:context:을 구현 했습니까? 그것은 속성이 변경 될 때 호출 될 메서드입니다.

+0

예, observeValueForKeyPath : ofObject : change : context :'를 구현했으며 다른 "일반"속성에 대해 호출됩니다. 또한 수동 알림을 사용할 때 정확한 정보와 같은 것으로 표시되기 때문에 작동한다고 가정합니다. – Monolo

+0

속성 값을 설정하는 코드를 게시 할 수 있습니까? –

+0

'mutableArrayValueForKey :를 사용하는 것을 멈추었으므로 문제는 어떻게 든 사라 졌으므로 나는 이것이 올바른 대답이라는 것을 받아 들일 것입니다. 언젠가는 더 조사 할 것입니다. – Monolo