2010-02-05 3 views
3

한 열에 특정 데이터 만 표시하도록 여러 열로 내 NSTableView를 설정하는 쉬운 방법은 무엇입니까? IBOutlets를 설정했지만 거기에서 어디로 가야할지 모르겠습니다.여러 열이있는 NSTableView

답변

7

코코아 바인딩/코어 데이터를 사용하지 않는다고 가정하면 NSTableViewDataSource 프로토콜의 두 가지 방법을 구현하여 NSTableView에 데이터를 표시 할 수 있습니다. 일반적으로 컨트롤러는 프로토콜을 구현하므로 컨트롤러하는 .m 파일을 열고 컨트롤러의 @implementation에 이러한 방법을 추가 할 것입니다 : 당신은 컨트롤러에 테이블의 dataSource 속성을 설정해야합니다

- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { 
    return 25; // fill this out 
} 

– (id) tableView:(NSTableView*)tableView 
     objectValueForTableColumn:(NSTableColumn*)column 
     row:(int)row { 
    return row % 3 ? @"Tick..." : @"BOOM!"; // fill this out 
} 

. Interface Builder에서 테이블 뷰에서 컨트롤러로 컨트롤을 드래그하고 dataSource을 설정하십시오. 이제 빌드하고 실행하면 테이블에 데이터가 표시됩니다.

하나의 열에 만 채우려면 IBOutlet NSTableColumn *을 컨트롤러에 추가하십시오. 그것을 explosiveColumn라고 부르 자. Interface Builder에서 컨트롤러에서 채우기를 원하는 열로 control- 드래그하고 explosiveColumn을 설정하십시오. 유용 할 수 있습니다

– (id) tableView:(NSTableView*)tableView 
     objectValueForTableColumn:(NSTableColumn*)column 
     row:(int)row { 
    if (column == explosiveColumn) { 
    return row % 3 ? @"Tick..." : @"BOOM!"; 
    } else { 
    // other columns blank for now 
    return nil; 
    } 
} 

이 튜토리얼 : 여기 http://www.cocoadev.com/index.pl?NSTableViewTutorial

+0

어떻게 테스트 할 수 있습니까? 여러 개의 열이 있지만 그 중 하나에 데이터가 표시되기를 원합니다. –

+0

이에 대한 자세한 내용은 답변을 업데이트했습니다. 기본적으로 열 매개 변수를 검사하여 관심있는 매개 변수인지 확인하고, 그렇지 않으면'nil'을 반환합니다. –

+0

감사합니다 !!!!!! –

0

이의 다음,있는 tableView에 : objectValueForTableColumn : 행 다음 column 매개 변수는 콘센트로 설정 한 것과 같은 객체 인 경우 당신은 테스트 할 수 있습니다 데이터 소스 방법과 다중 테이블 뷰 및 문서 기반의 어플리케이션을 사용하여 실시 예 :

#pragma mark - Data Source Methods 
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv 
{ 
    if (tv == racerTableView) 
     return [racerList count]; 
    else if (tv == vehicleTableView) 
     return [vehicleList count]; 
    else 
     return 0; // something wrong here... 
} 

- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col 
     row:(NSInteger)rowi 
{ 
    NSString *colid = [col identifier]; 
    if (tv == racerTableView){ 
     NHRacers *racer = [racerList objectAtIndex:rowi]; 
     return [racer valueForKey:colid]; 
    } 
    else if (tv == vehicleTableView){ 
     NHVehicles *vehicle = [vehicleList objectAtIndex:rowi]; 
     return [vehicle valueForKey:colid]; 
    } 
    else 
     return 0; // something wrong here... 
} 

- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi 
{ 
    NSString *colid = [col identifier]; 
    if (tv == racerTableView) { 
     NHRacers *racer = [racerList objectAtIndex:rowi]; 
     [racer setValue:obj forKey:colid]; 
    } 
    else if (tv == vehicleTableView){ 
     NHVehicles *vehicle = [vehicleList objectAtIndex:rowi]; 
     [vehicle setValue:obj forKey:colid]; 
    } 
    else 
     nil; // something wrong here...  
    [self updateChangeCount:NSChangeDone]; 
} 

의 tableview 소스 유출구는 파일의 소유자로 설정하고, 파일의 사용을 t vehicleTableView 및 racerTableView 설정했다 IB의 "표보기"를 상속하십시오. colid 키는 식별자를 확인합니다 (IB에서 "Identity"드롭 다운 아래의 테이블보기 열을 선택하면 "Identity Inspector"가 표시됨). 이 값은 테이블 뷰에 표시되는 클래스의 KVC (키 코딩 호환) 속성으로 선택되었습니다. 소문자 첫 글자를 사용합니다 (휴지로 Apple 문서 참조). 예를 들어

: (NHVehicles.h에서)

@interface NHVehicles : NSObject 
{ 
    NSUInteger entry; 
    NSString *name; 
    NSString *vehicleClass; 
} 
@property NSUInteger entry; 
@property NSString *name, *vehicleClass; 
@end 

"항목"이있는 tableView에 대한

@implementation NHVehicles 
@synthesize entry, name, vehicleClass; 
@end 

(NHVehicles.m에서), "이름"과 "vehicleClass"것

클래스에 데이터를 표시하지 않으려면 열 식별자의 키를 입력하지 마십시오. c 단어 aution : Xcode 4.5.1을 사용하고 있는데, 특정 열 식별자에 대해 몇 개의 키를 입력하고 텍스트를 지우려는 시도를 한 후에 식별자 필드에서 텍스트를 삭제하면 불만을 나타 냈습니다. 편집 한 열의 입력란을 더 이상 비워 둘 수 없습니다.) 이것은 해결하기가 어렵지 않았지만 놀라운 일이었습니다.