2010-05-19 2 views
0

NSArrayController를 통해 NSMutableArray에 바인딩하는 NSTableView가 있습니다. 배열에있는 것은 파생 클래스입니다. 테이블의 처음 몇 열은 기본 클래스에있는 속성에 바인딩됩니다. 그건 모두 잘 작동합니다.NSTableView의 조건부 열 값은 무엇입니까?

문제가 발생하는 곳은 행이 특정 하위 클래스에 매핑되는 경우에만 채워 져야하는 열입니다. 컬럼이 의미하는 속성은 기본 클래스 측면에서 의미가 없으므로 해당 서브 클래스에만 존재합니다. 사용자는 첫 번째 두 열에서 왜 세 번째 열의 셀이 채워지거나 편집 가능한지 알게됩니다.

세 번째 열의 값에 대한 바인딩은 "foo.name"과 같은 모델 경로가있는 arrangedObjects에 있습니다. 여기서 foo는 하위 클래스의 속성입니다. 그러나 계층 구조의 다른 하위 클래스는 foo에 대해 키 - 값을 준수하지 않으므로이 방법은 작동하지 않습니다.

내 유일한 선택은 모든 사람이 그것에 응답하기 위해 foo를 기본 클래스의 속성으로 설정하는 것처럼 보이지만 모델 개체의 인터페이스를 혼란스럽게합니다.

누구나 이런 상황에 대해 깨끗한 디자인을 제안 했습니까? 드문 일이 아닙니다. (저는 코코아를 처음 접했을뿐입니다.)

답변

1

이 문제를 해결하는 방법 중 하나는 첫 번째 두 열에 바인딩을 사용하는 것입니다. 공장. 나머지 열은 필요한 사용자 지정 논리를 구현하는 NSTableViewDataSource를 구현합니다.

가 먼저

-tableView:objectValueForTableColumn:row: 
-tableView:setObjectValue:forTableColumn:row: 

를 구현하는 새로운 클래스를 생성 (사용자가 다른 열을 편집 할 것으로 예상되는 경우에만 2가 필요합니다). 그런 다음

IBOutlet NSArrayController *valuesController; 

인스턴스 변수를 해당 클래스에 추가하십시오.

Inside Interface Builder에서 해당 클래스의 새 개체를 추가합니다. 파란색 "개체"큐브를 라이브러리의 파일 창으로 끌어옵니다. 어레이 컨트롤러를 새 데이터 소스에 연결하십시오. 그런 다음 데이터 소스를 테이블 뷰와 연결하여 테이블 뷰의 데이터 소스로 만듭니다.

처음 두 개를 넘은 열이 다른 것과 바인딩되지 않았는지 확인하십시오. 필요에 따라

-tableView:objectValueForTableColumn:row: 

방법은 그 열을 요구받을 것이며, 필요에 따라 객체를 볼 수 있습니다 :

- (id)tableView:(NSTableView *)aTableView 
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
         row:(NSInteger)rowIndex; 
{ 
    NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex]; 
    id columnIdentifier = [aTableColumn identifier]; 
    if ([columnIdentifier isEqual:@"foo"]) { 
     if ([myObject respondsToSelector:@selector(fooValue)]) { 
      return [myObject fooValue]; 
     } 
    } 
    return nil; 
} 

주 내가 볼 수있는 열 식별자를 사용하고 어떻게하는 열이 요청됩니다. Interface Builder 내에서 열 식별자를 설정하십시오.