0

Aaron Hillegass의 Cocoa Programming for Mac OS X에서 Raiseman 응용 프로그램은 인터페이스 작성기 (IB)의 단추를 -remove:으로 NSArrayController으로 연결합니다. MyDocument 클래스 그 두 KVC 방법을 구현한다 :이 버튼을 누르면KVC Hillegass 이해 및 재현 컨트롤러에서/삽입하는 개체

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index; 
- (void)removeObjectFromEmployeesAtIndex:(int)index; 

상기 -removeObjectFromEmployeesAtIndex: 메소드가 호출되어 현재 선택된 이용시 (모델) 객체 어레이로부터 제거한다.

  1. remove: 메서드를 사용하여 -removeObjectFromEmployeesAtIndex: 메서드를 호출하면 어떻게됩니까?
  2. NSTreeController으로이 효과를 어떻게 재현합니까?
+0

트리 컨트롤러로 무엇을 시도했으며 어떻게 실패 했습니까? 그것은 유용한 정보가 될 것입니다. – Dov

+0

폴더 유형과 사용자 객체의 두 가지 노드 유형이 있다고 가정 해보십시오. IB에서는 트리 컨트롤러의 객체 컨트롤러 클래스 이름을 Folder 또는 Person으로 설정하여 둘 중 하나를 추가 할 수 있습니다. 하지만 트리의 깊이에 따라 또는 다른 추가 및 제거 버튼 쌍을 사용하여 Folder 또는 Person을 추가 할 수는 없습니다. –

답변

0

간단한 내장 옵션을 원할 경우 IB로 지정한 클래스의 인스턴스 만 만들 것입니다. 다른 인스턴스를 만들려면 직접 코드를 작성해야합니다. 새 클래스를 계층 구조의 적절한 위치에 삽입하려면 Tree Controller에서 필요한 모든 정보를 가져야합니다. 근면 한 검색을 통해 필요한 코드를 얻을 수 있습니다.

NSArrayController 메커니즘이 작동하는 방식을 이해하는 데 도움이되도록 Objective-C와 런타임에 대한 지식을 최대한 활용하여 설명합니다. Objective-C는 매우 동적 인 언어이며 선택기 (메서드)를 동적으로 호출 할 수 있습니다. NSArrayController이 클래스 (예 : "직원")의 이름을 알고 있기 때문에, 내부 구현은 아마도 (수 쉽게 또는) 다음과 같은 :

NSString *removeSelectorName = [NSString stringWithFormat:@"removeObjectFrom%@sAtIndex:", 
           self.objectClassName]; 
SEL removeSelector = NSSelectorFromString(removeSelectorName); 

[dataRepresentation performSelector:removeSelector 
         withObject:[NSNumber numberWithInt:self.selectionIndex]; 

이의 예는와 마찬가지로, KVO 다른 곳이 있습니다 +keyPathsForValuesAffecting<Key> 메서드 (documentation here)는 어떤 키가 다른 키를 업데이트하는지 설명합니다. 키가 fullName 이름과 첫 번째 또는 마지막 이름 변경, 당신은 당신의 클래스에서이를 구현 할 때마다 업데이트되는 경우

+ (NSSet *)keyPathsForValuesAffectingFullName { 
    return [NSSet setWithObjects: 
      @"firstName", 
      @"lastName", 
      nil]; 
} 

또한 검색 (그리고 this question) 어떻게의 의미를 설명하고이 documentation page를, 켜져 메서드가 호출됩니다.

+0

어떤 경우에도 IB에서 사용되는 remove : 메서드로 인해 -removeObjectFromEmployeesAtIndex : 메서드가 KVC에서 호출됩니다. –

+0

설명과 함께 업데이트되었습니다. – Dov

+0

이전에 해당 질문 및 설명서 페이지를 보았습니다. 그것은 말합니다 : "mutableArrayValueForKey에 대한 기본 검색 패턴은 ...입니다."문제는 실제로 : 누군가가 insert : mutableArrayValueForKey를 호출하는 것을 어떻게 알 수 있습니까? (사실은 그렇습니다) - 문서는 어디에 있습니까? 지금 Hillegass와 다른 사람들은 그것을 사용하지만 어떻게 사용 하는지를 말하지 않습니다. 고맙습니다. –