Вопрос

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

Это было полезно?

Решение

Предполагая, что вы не используете привязки Cocoa / Core Data, вы можете отобразить данные в NSTableView, реализовав два метода из NSTableViewDataSource Источник данных протокол.Обычно ваш контроллер реализует протокол, поэтому откройте файл controller .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.В 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

Другие советы

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

#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 путем выбора столбца табличного представления в раскрывающемся списке "Identity", при этом отображается "Identity Inspector").Эти значения были выбраны в качестве свойств KVC (совместимых с кодированием ключей) классов, отображаемых в табличных представлениях:используйте первую букву нижнего регистра (остальное см. в документах Apple docs).

Например:(в 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" будут введены (без "o ") в поля идентификатора для их соответствующих столбцов.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top