将对象添加到基于单元格的NSTableView中的列?

时间:2014-01-25 01:39:32

标签: objective-c macos cocoa nstableview

我在NSTableview中遇到了Columns问题。我想将项添加到NSTableView实例中的特定列。 (请注意,数据是指向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,而且我知道这是最佳实践,我不想逃避这一点。)我希望我的解释很清楚,任何帮助都会非常感谢。

1 个答案:

答案 0 :(得分: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];
}