NSTableView с несколькими столбцами

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

2 ответа

Решение

Предполагая, что вы не используете привязки какао / основные данные, вы можете отобразить данные в 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 Свойство для контроллера. В Интерфейсном Разработчике перетащите контроль от представления таблицы до контроллера и установите 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];
}

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

для этого tableView "entry", "name" и "vehicleClass" будут вводиться (без) в поля идентификаторов для соответствующих столбцов.

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

Другие вопросы по тегам