2014-01-25 3 views
0

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

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

ответ

0

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

Вы должны думать о каждом элементе в своем массиве в виде строки в виде таблицы. Если вы хотите отображать разные значения в столбцах этой строки, вам нужен способ сохранить эти разные значения в объекте источника данных. Это можно сделать, используя конкретный модельный класс объектов, который имеет несколько определенных свойств или используя 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]; 
} 

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

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

-(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]; 
} 
+0

Хорошо, так что я думаю, я получаю это. Экземпляр NSTableView вызывает tableView: objectValueForTableColumn: row: один раз для каждого NSTableColumn в таблицеView. Поэтому, если идентификатор столбца не соответствует ни одному ключу, он возвращает значение null, и ничего не происходит. В результате только таблицыColumns, идентификатор которых соответствует ключу для значения, будут заполняться этими значениями! – PopKernel

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