2012-08-17 4 views
3

다른 클래스 (modelArray)에 바인딩 된 내용을 사용하여 사용자 정의 클래스 (MyClass) 배열을 배열 컨트롤러 (NSArrayController)에 프로그래밍 방식으로 바인딩하고 싶습니다. MyClassNSTableView과 같이 배열 내용을 표시합니다.NSArrayController의 배열 된 객체에 바인딩하는 방법

내 문제는 경우 : 변경 가능한 배열의 메소드가 호출되도록 방법이 바인딩을 만드는 방법, 그 방법

내가 이런 식으로 결합하는 경우 이
-(void) insertObject:(id)object inContentAtIndex:(NSUInteger)index 
-(void) removeObjectFromContent:(id) object 
이 이 이

는 (1) 위의 방법이 라고이다 하지만 컨트롤러의 콘텐츠는 더 이상 (분명히)이 modelArray

[myArrayController bind:@"contentArray" toObject:myClassInstance withKeyPath:@"content" options:nil]; 

나는이 방법으로 결합하는 경우 (2)에만 setContent:content 방법이라고 아닌 가변 방법에 바인딩되지 않습니다. 또한 나는 그 방법 (setContent:content)를 제거하려했지만 그것은 단지 setValue:forUndefinedKey:

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"arrangedObjects" options:nil]; 

또는

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"content" options:nil]; 

나는 생각하지 않는다 전체 테이블의 배열이되어 다시 세트를 예외가 발생 배열 컨트롤러에 바인드 될 때마다 라인이 추가 될 때마다 동일한 바인딩이 필요합니다.

답변

2

키 값 코딩을 통해 배열 값을 처리하는 방법과 관련된 문제가 있습니다. KVC에는 특정 유형 지정에 대한 개념이 없으므로 KVC를 통해 배열 값에 액세스 할 때 반환 된 배열이 변경 가능하다는 것을 알 수 없습니다. 최악의 경우 (즉, 배열이 불변 인 경우)를 가정해야합니다. 정상적으로 처리하는 방법은 이 NSMutableArray와 같이과 같은 역할을하는 프록시 객체를 사용하는 것입니다.하지만 그 뒤에는 가정 된 불변 배열을 취하여 변경 가능한 복사본을 만들고 복사본을 변경 한 다음 해당 객체를 사용하여 다시 푸시합니다. 세터. (이것은 예상되는 동작입니다. 전체 배열이 대체되어 대신 교체됩니다.)

이 기능을 제어하는 ​​방법은 - (NSMutableArray *)mutableArrayValueForKey:(NSString *)key입니다. 그 방법에서는 잠재적으로 많은 일이 일어날 것입니다. 그리고 전체 이야기를하기 위해이 메소드의 헤더 주석에 붙여 넣을 것입니다. 그러나 긴 이야기를 짧게하기 위해, NSArrayController가 변경 가능한 배열을 제자리에 돌리고 싶다면, 가장 간단한 방법은 modelArray 속성을 vends 클래스에이 재정의를 추가하는 것입니다

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key 
{ 
    if ([@"modelArray" isEqual: key]) 
    { 
     // We know this is mutable, even if KVC doesn't! 
     return self.modelArray; 
    } 
    return [super mutableArrayValueForKey:key]; 
} 

긴 이야기는 KVC가 수집 돌연변이를 처리하는 방법을 알아 내려고 할 때 찾는 것이 일의 순서가 있다는 것입니다. 자세한 내용은 NSKeyValueCoding.h에 설명되어 있습니다. 다음은 mutableArrayValueForKey:에 대한 코멘트입니다.

정렬 다 관계를 식별하는 키를 감안 관련 개체에 대한 읽기 쓰기 액세스를 제공하는 가변 배열을 반환한다. 변경 가능한 배열에 추가 된 개체는 수신기와 관련이 있으며 변경 가능한 배열에서 제거 된 개체는 관련이 없으므로 이됩니다.

이 메소드의 디폴트 구현은 인식 같은 간단한 접근 방법과 배열 접근 방법 -valueForKey 같은 :의, 그리고 이 같은 직접 인스턴스 변수에 액세스 정책을 따르지만 항상 대신의 변경 가능한 컬렉션을 프록시 객체를 반환 -valueForKey :가 리턴하는 변경 불가능한 콜렉션. 또한 :

  1. 은 (맥 OS 10.4 도입) 이름 -insertObject:in<Key>AtIndex:-removeObjectFrom<Key>AtIndex:합니다 (NSMutableArray의 클래스에 의해 정의 된 두개 원시적 인 방법들에 대응하는) 패턴과 일치하는 방법에 대한 수신기의 클래스 및 를 검색 또한 -insert<Key>:atIndexes:-remove<Key>AtIndexes: (-[NSMutableArray insertObjects:atIndexes:]-[NSMutableArray removeObjectsAtIndexes:]에 해당). 적어도 하나의 삽입 방법이라면 적어도 하나의 제거 방법으로는 -mutableArrayValueForKey: 원래 수신기로 전송되는 컬렉션 프록시 객체 -insertObject:in<Key>AtIndex:, -removeObjectFrom<Key>AtIndex: , -insert<Key>:atIndexes:-remove<Key>AtIndexes: 메시지의 조합을 초래할 것이다 보내 각 NSMutableArray의 메시지가 발견된다. 수신기의 클래스는 이름이 방법은 적절한 때 최적의 성능을 위해 사용됩니다 -replace<Key>AtIndexes:with<Key>:하는 패턴 (맥 OS 10.4에 도입) -replaceObjectIn<Key>AtIndex:withObject: 또는 일치하는 선택 방법을 구현하는 경우.
  2. 그렇지 않으면 (배열 변이 분석 메서드 집합이 없음) 수신자 클래스에서 과 일치하는 이름을 가진 접근 자 메서드를 검색합니다 (-set<Key>:). 그러한 메소드가 발견되면 각 NSMutableArray 메시지가 콜렉션 프록시 객체로 전송되어 -set<Key>: 메시지가 원래 수신기 -mutableArrayValueForKey:으로 전송됩니다. 수신기의 클래스 ' +accessInstanceVariablesDirectly있어서, YES 복귀 이름이 패턴 _<key> 또는 <key> 일치 인스턴스 변수는 수신기의 클래스를 검색하는 경우
  3. 그렇지 (배열 돌연변이 방법이나 간단한 접근 방법 아니 세트 발견되는)을 그와 같은 순서로. 이러한 인스턴스 변수 이 발견되면 컬렉션 프록시 개체로 전송 된 각 NSMutableArray 메시지는 인스턴스 변수 값으로 전달됩니다. 따라서 은 일반적으로 NSMutableArray의 인스턴스이거나 NSMutableArray의 하위 인스턴스 여야합니다.
  4. 그렇지 않으면 (배열 변경 메서드, 간단한 접근 자 메서드 또는 인스턴스 변수 집합을 찾을 수 없음) 어쨌든 변경 가능한 컬렉션 을 반환합니다. 콜렉션 프록시 객체로 전송 된 각 NSMutableArray 메시지는 메시지가 -mutableArrayValueForKey:의 원래 수신자에게 전송되게합니다. -setValue:forUndefinedKey:의 기본 구현은 NSUndefinedKeyException을 발생 시키지만 응용 프로그램에서이를 대체 할 수 있습니다.