Добавление объекта в столбец в NSTableView на основе ячеек?

У меня проблемы со столбцами в NSTableview. Я хочу добавить элемент в определенный столбец в экземпляре NSTableView. (Обратите внимание, что данные - это указатель на экземпляр NSMutableArray, который является свойством AppDelegate, который является источником данных)

-(IBAction)addTask:(id)sender
{
[self.data addObject:@""];
[self tableView:_tableView setObjectValue:@"Hello World" forTableColumn: self.column row:0];
[self.tableView reloadData];
}

В учебном пособии, которое я изучил, показано, как редактировать NSTableView с одним столбцом. Однако при использовании одной и той же реализации методов NSTableViewDataSource tableView заполняет оба столбца. Соответствующая реализация из учебника:

-(void)tableView:(NSTableView *)tableView
setObjectValue:(id)object
forTableColumn:(NSTableColumn *)tableColumn
         row:(NSInteger)row
{
[self.data replaceObjectAtIndex:row withObject:object];
}

Я считаю, что отчасти проблема заключается в том, что вышеуказанный метод ничего не делает с параметром tableColumn, но я все еще учусь и не знаю, как действовать дальше. (Особенно трудно найти помощь, потому что многие современные учебники включают NSTableView на основе представлений, и я знаю, что это лучшая практика, я не хочу убегать от этого.) Я надеюсь, что мое объяснение было достаточно ясным, и любая помощь будет буду очень признателен.


person PopKernel    schedule 25.01.2014    source источник


Ответы (1)


Причина, по которой вы видите данные, заполненные несколькими столбцами, заключается в том, что вы не различаете, какие значения входят в какие столбцы.

Вы должны думать о каждом элементе в вашем массиве как о строке в представлении таблицы. Если вы хотите отображать разные значения в столбцах этой строки, вам нужен способ сохранить эти разные значения в объекте источника данных. Это можно сделать, используя конкретный объектный класс модели, который имеет несколько определенных свойств, или используя NSDictionary с разными ключами с соответствующими значениями.

Для добавления строки:

-(IBAction)addTask:(id)sender
{
    NSMutableDictionary *newRow = [NSMutableDictionary dictionary];
    [newRow setObject:@"Hello World" forKey:@"salutation"];
    [self.data addObject:newRow];
    [self.tableView reloadData];
}

Итак, для кода дисплея:

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    NSDictionary *row = [self.data objectAtIndex:rowIndex];

    NSString *columnIdentifier = [aTableColumn identifier];

    return [row objectForKey:columnIdentifier];
}

Вы заметите, что мы используем здесь идентификатор столбца. Обычно вы устанавливаете это значение в Интерфейсном Разработчике в столбце таблицы. В приведенном выше случае идентификатор должен совпадать с ключом в словаре, для которого вы хотите отображать информацию.

Наконец, позволяя пользователю установить значение столбца в табличном представлении:

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger) rowIndex
{
    NSDictionary *row = [self.data objectAtIndex:rowIndex];

    NSString *columnIdentifier = [aTableColumn identifier];

   [row setValue:anObject forKey:columnIdentifier];
}
person Michael Ledford    schedule 25.01.2014
comment
Хорошо, думаю, я понял. Экземпляр NSTableView вызывает tableView: objectValueForTableColumn: row: один раз для каждого NSTableColumn в tableView. Поэтому, если идентификатор столбца не соответствует ни одному ключу, он возвращает ноль, и ничего не происходит. В результате только tableColumns, идентификатор которых совпадает с ключом для значения, будут заполнены этими значениями! - person PopKernel; 26.01.2014