여러 열이있는 nstableview
-
18-09-2019 - |
문제
한 열에 특정 데이터 만 표시하기 위해 여러 열로 NstableView를 설정하는 쉬운 방법은 무엇입니까? Iboutlets가 설정되어 있지만 거기에서 어디로 가야할지 모르겠습니다.
해결책
코코아 바인딩/코어 데이터를 사용하지 않는다고 가정하면 nstableviewdatasource 규약. 일반적으로 컨트롤러는 프로토콜을 구현하므로 컨트롤러 .M 파일을 열고 컨트롤러의에 이러한 메소드를 추가합니다. @implementation
:
- (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
}
테이블을 설정해야합니다 dataSource
컨트롤러에 속성. 테이블보기에서 컨트롤러 및 세트로 인터페이스 빌더 제어 드래그에서 dataSource
. 이제 빌드하고 실행하면 테이블에 데이터가 표시됩니다.
하나의 열만 작성하려면 컨트롤러에 iboutlet nstablecolumn*을 추가하십시오. 그것을 부르자 explosiveColumn
. 인터페이스 빌더에서 컨트롤러에서 작성하려는 열로 제어 드래그 explosiveColumn
. 그런 다음 TableView : ObjectValuefortableColumn : Row : column
매개 변수는 배출구가 설정된 것과 동일한 객체입니다.
– (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
다른 팁
다음은 데이터 소스 방법과 문서 기반 애플리케이션과 함께 여러 테이블보기를 사용하는 예입니다.
#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 DataSource 아울렛은 파일의 소유자에게 설정되었으며 파일의 소유자는 IB의 VehicletableView 및 RacertableView를 해당 "테이블보기"로 설정했습니다. Colid 키는 식별자를 확인합니다 ( "Identity"드롭 다운 아래 테이블 뷰 열을 선택하여 IB로 설정하고 "Identity Inspector"가 표시됩니다). 이 값은 테이블 뷰에 표시되는 클래스의 KVC (키 코딩 호환) 속성으로 선택되었습니다. 저 소문자 첫 글자를 사용하십시오 (휴식은 Apple 문서 참조).
예 : (nhvehicles.h)
@interface NHVehicles : NSObject
{
NSUInteger entry;
NSString *name;
NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end
(nhvehicles.m)
@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end
이 테이블 뷰의 경우 "Entry", "Name"및 "VehicleClass"가 해당 열의 식별자 필드에 입력됩니다 (w/o ").
클래스에 일부 데이터를 표시하지 않으려면 열 식별자의 키를 입력하지 마십시오. 주의 한 단어 : Xcode 4.5.1을 사용하고 있으며 일단 특정 열 식별자에 대한 몇 개의 키를 입력 한 다음 내 마음을 바꾸고 텍스트를 지우려고 시도한 것을 알았습니다. 식별자 필드 (편집 한 열에 대해 더 이상 필드를 비워 둘 수 없습니다). 이것은 일하기 어렵지 않았지만 놀랍습니다.