2010-02-05 26 views
3

什麼是使用多列設置我的NSTableView以僅在一列中顯示某些數據的簡單方法。我有IBOutlets設置,但我不知道從哪裏去。帶有多列的NSTableView

回答

7

假設您沒有使用可可綁定/核心數據,您可以通過實施NSTableViewDataSource協議中的兩種方法在NSTableView中顯示數據。通常,控制器將執行協議,因此打開控制器.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屬性設置爲控制器。在Interface Builder控制中 - 從表視圖拖動到控制器並設置dataSource。現在構建並運行,您應該可以在表格中看到您的數據。

如果您只想填寫一列,請將IBOutlet NSTableColumn *添加到您的控制器;我們稱之爲explosiveColumn。在界面生成器中,從控制器拖動到要填寫的列並設置explosiveColumn。然後,在的tableView:objectValueForTableColumn:行:你可以測試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

+0

我該如何測試它?我有多列,但我希望數據只能在其中一列顯示 – 2010-02-05 22:56:36

+0

我已經更新了有關此更詳細的詳細信息的答案。基本上你檢查列參數是否是你感興趣的那個,否則返回'nil'。 – 2010-02-06 00:49:53

+0

謝謝!!!!!! – 2010-02-06 01:33:38

0

這裏是一個例如,使用與數據源的方法和基於文檔的應用程序的多個表的觀點:

#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]; 
} 

數據源出口被設置爲文件的所有者以及文件的所有者已成立vehicleTableView和racerTableView到t的tableview中繼承人在IB中各自的「表格視圖」。 colid鍵檢查標識符(在IB中通過選擇「Identity」下拉列表下方的表視圖列來設置標識符,而顯示「Identity Inspector」)。這些值被選擇爲表視圖中顯示的類的KVC(關鍵編碼兼容)屬性:使用小寫的第一個字母(請參閱apple docs for rest)。

例如: (在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 

此的tableView, 「項」, 「名」 和 「vehicleClass」 會(w/o「)輸入到它們各自列的標識符字段中

如果您不想在類中顯示某些數據,則不要輸入列標識符的關鍵字。 aution:我使用的是Xcode 4.5.1,我注意到一旦我爲特定的列標識符輸入了幾個鍵,然後改變了主意並嘗試清除文本,它就會在我從標識符字段中刪除文本時抱怨我不能再把這個字段留給我編輯過的列)。這並不難解決,但這是一個驚喜。