2010-02-05 6 views
3

Что такое простой способ настроить мой NSTableView с несколькими столбцами, чтобы отображать только определенные данные в одном столбце. У меня есть IBOutlets, но я не знаю, куда идти оттуда.NSTableView с несколькими столбцами

ответ

7

Предполагая, что вы не используете привязки/данные ядра какао, вы можете отображать данные в NSTableView, реализуя два метода из протокола 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 свойства таблицы к контроллеру. В интерфейсе Builder перетащите элемент из представления таблицы в контроллер и установите dataSource. Теперь создайте и запустите, и вы увидите свои данные в таблице.

Если вы хотите заполнить только один столбец, добавьте IBOutlet NSTableColumn * к вашему контроллеру; назовем это explosiveColumn. В Interface Builder перетащите регулятор с контроллера на столбец, который вы хотите заполнить, и установите 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

как я могу проверить его? У меня есть несколько столбцов, но я хочу, чтобы данные отображались только в одном из них. –

+0

Я обновил ответ с более подробной информацией об этом. В основном вы проверяете параметр столбца, чтобы узнать, является ли он тем, кого вас интересует, и возвратите 'nil' в противном случае. –

+0

спасибо !!!!!! –

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

TableView DataSource розетки устанавливаются для каждого файла владельца и файла Владелец установил vehicleTableView и racerTableView к т наследуйте соответствующий «Вид таблицы» в IB. Клавиша colid проверяет идентификатор (устанавливается в IB, выбирая столбец представления таблицы в раскрывающемся списке «Идентичность», пока отображается «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 ") в поля идентификатора для соответствующих столбцов.

Если вы не хотите показывать некоторые данные в классе, просто не вводите ключ для идентификатора столбца. Слово c Я использую Xcode 4.5.1, и я заметил, что как только я ввел несколько ключей для определенных идентификаторов столбцов, а затем изменил свое мнение и попытался очистить текст, он пожаловался, когда я удалил текст из поля идентификатора (Я больше не мог оставить поле пустым для столбцов, которые я редактировал). Это было непросто обойти, но это было неожиданностью.

Смежные вопросы