NSTableView с несколькими столбцами - PullRequest
3 голосов
/ 05 февраля 2010

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

Ответы [ 2 ]

7 голосов
/ 05 февраля 2010

Предполагая, что вы не используете привязки какао / основные данные, вы можете отобразить данные в 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

0 голосов
/ 25 октября 2012

Вот пример использования нескольких табличных представлений с методами источника данных и приложения на основе документов:

#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 устанавливаются как Владелец файла, а Владелец файла установил 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, и я заметил, что, как только я ввел несколько ключей для идентификаторов определенного столбца, а затем передумал и попытался очистить текст, он пожаловался, когда я удалил текст из поле идентификатора (я больше не мог оставлять поле пустым для отредактированных столбцов). Обойти это было несложно, но это стало неожиданностью.

...