Добавяне на обект към колона в базиран на клетка NSTableView?

Имам проблем с колони в NSTableview. Искам да добавя елемент към конкретна колона в екземпляр на NSTableView. (Имайте предвид, че data е указател към екземпляр на NSMutableArray, което е свойство на AppDelegate, което е dataSource)

-(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, базирани на изгледи, и добре, знам, че това е най-добрата практика, не искам да бягам от това.) Надявам се, че обяснението ми беше достатъчно ясно и всяка помощ би бъдете много оценени.


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];
}

Ще забележите, че тук използваме идентификатора на колоната. Обикновено задавате тази стойност в 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];
}
person Michael Ledford    schedule 25.01.2014
comment
Добре, мисля, че разбирам. Екземплярът NSTableView извиква tableView:objectValueForTableColumn:row: веднъж за всяка NSTableColumn в tableView. Така че, ако идентификаторът на колоната не съвпада с нито един ключ, той връща нула и нищо не се случва. В резултат на това само таблицатаColumns, чийто идентификатор съвпада с ключа за дадена стойност, ще се попълни с тези стойности! - person PopKernel; 26.01.2014