Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在基于单元格的NSTableView中将对象添加到列中?_Objective C_Macos_Cocoa_Nstableview - Fatal编程技术网

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

Objective c 在基于单元格的NSTableView中将对象添加到列中?,objective-c,macos,cocoa,nstableview,Objective C,Macos,Cocoa,Nstableview,我在NSTableview中的列有问题。我想向NSTableView实例中的特定列添加一项。(请注意,data是指向NSMutableArray实例的指针,NSMutableArray是数据源AppDelegate的属性) 我通过的一个教程向我展示了如何编辑单列NSTableView。但是,使用相同的NSTableViewDataSource方法实现会导致tableView填充这两列。本教程中的相关实现: -(void)tableView:(NSTableView *)tableView set

我在NSTableview中的列有问题。我想向NSTableView实例中的特定列添加一项。(请注意,data是指向NSMutableArray实例的指针,NSMutableArray是数据源AppDelegate的属性)

我通过的一个教程向我展示了如何编辑单列NSTableView。但是,使用相同的NSTableViewDataSource方法实现会导致tableView填充这两列。本教程中的相关实现:

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

我认为问题的一部分原因是,上述方法对tableColumn参数没有任何作用,但我仍在学习,不知道如何继续。(很难找到帮助,因为许多现代教程都涉及基于视图的NStableView,我知道这是最佳实践,我不想逃避这一点。)我希望我的解释足够清楚,任何帮助都将不胜感激。

您看到数据填充在多个列中的原因是您没有区分哪些列中包含哪些值

您应该将数组中的每个项都视为表视图中的一行。如果希望在该行的列中显示不同的值,则需要在数据源对象中存储这些不同值的方法。这可以通过使用定义了多个属性的具体模型对象类或使用具有不同键及其相应值的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];
}

好的,我想我明白了。NSTableView实例为tableView中的每个NSTableColumn调用tableView:objectValueForTableColumn:row:一次。因此,如果列的标识符与任何键都不匹配,它将返回null,并且不会发生任何事情。因此,只有标识符与值的键匹配的tableColumns才会填充这些值!
-(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];
}