Cocoa 以编程方式将列(带绑定)添加到基于视图的NSTableView?

Cocoa 以编程方式将列(带绑定)添加到基于视图的NSTableView?,cocoa,nstableview,cocoa-bindings,nstablecolumn,Cocoa,Nstableview,Cocoa Bindings,Nstablecolumn,我有一个简单的应用程序,它在NSTableView中列出了一些模型 该表是一个完全基于视图的标准表,包含两列,并使用绑定通过NSArrayController填充。所有这些都是在Interface Builder中设置的,它的工作方式与预期的一样 现在,我想以编程方式添加更多的列,并将这些新列绑定到模型中的各种键路径。在那里,我被卡住了 为简单起见,假设此设置: 模型对象是纯对象,只有一个NSString属性:name AppDelegate有一个NSArray属性(models),该属性包含许

我有一个简单的应用程序,它在
NSTableView
中列出了一些模型

该表是一个完全基于视图的标准表,包含两列,并使用绑定通过
NSArrayController
填充。所有这些都是在Interface Builder中设置的,它的工作方式与预期的一样

现在,我想以编程方式添加更多的列,并将这些新列绑定到模型中的各种键路径。在那里,我被卡住了

为简单起见,假设此设置:

  • 模型对象是纯对象,只有一个NSString属性:
    name
  • AppDelegate有一个NSArray属性(
    models
    ),该属性包含许多模型实例
  • NSArrayController的
    内容
    绑定到应用程序代理的
    模型
    数组
  • NSTableView的
    内容
    绑定到阵列控制器的
    排列对象
  • 表的第一列被绑定(在IB中)以显示
    name
    属性,即列→ 表格单元格视图→ 静态文本表视图单元格→ 值绑定到表单元格视图的objectValue.name
  • 据我所知,这是直截了当的,而且很有魅力

    但是…那么我如何添加更多的列呢

    要以编程方式添加一个列(为了保持简单,让我们假设这个新列还应该显示
    name
    属性,就像已经存在的列一样),我想我应该在app delegate中执行以下操作:

    NSTableColumn* newColumn = [[NSTableColumn alloc] initWithIdentifier:@"newColumn"];
    
    // do binding magic somehow
    // [[newColumn dataCell] bind:NSValueBinding toObject:??? withKeyPath:??? options:nil];
    
    [self.table addColumn:newColumn]; // the table's connected with an IBOutlet
    
    我已经尝试了很多从/到数据单元、表、列、数组控制器、数组本身以及各种键路径的绑定组合,但都不起作用。新列添加得很好,但从未填充

    我认为我创建的基本NSTableColumn实例是基于单元格的,而不是基于视图的,这会带来麻烦。但是,我不知道如何从这里开始,文档也从来没有提到以编程方式添加的绑定列

    在本例中,我只需要一个简单的文本列,绑定到模型,就像我可以轻松设置的那个一样

    我可以通过实现一个
    NSTableViewDataSource
    并“手动”输入表来完成所有这些,但我已经用绑定设置了所有其他内容

    任何帮助都将不胜感激。

    请尝试以下方式:-

    NSString *akey = @"keyValue";
    NSString *keypath = [NSString stringWithFormat:@"arrangedObjects.%@",akey];
    NSTableColumn *tableColumn=[[NSTableColumn alloc]initWithIdentifier:@"newColumn"];
    
    [tableView addTableColumn:tableColumn];
    [tableColumn bind:NSValueBinding toObject:yourArrayController withKeyPath:keypath options:nil];
    NSMutableDictionary *dc=[NSMutableDictionary dictionary];
    [dc setObject:@"textValue" forKey:@"keyValue"];
    [yourmutableArray addObject:dc];
    [self setYourmutableArray:yourmutableArray];
    

    请注意:-您的可变数组应绑定到arraycontroller,然后只有它将填充数据

    您需要使用此委托方法绑定到列的NSTableCellView的子视图:

    - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
    {
        // Get cell view - NSTableCellView
        // This can be a prototype loaded from the table view or from another nib
        // see : - registerNib:forIdentifier:
        NSView *cellView = [tableView makeViewWithIdentifier:@"Cell1" owner:[tableView delegate]];
    
        // - subViewWithIdentifier is a simple category method that searches -subviews
        NSView *subView = [cellView subViewWithIdentifier:@"TextField1"];
        [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.name" options: nil];
    
        subView = [cellView subViewWithIdentifier:@"TextField2"];
        [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.address" options: nil];
    
        return cellView;
    }
    
    NSView类别方法:

    - (NSView *)subViewWithIdentifier:(NSString *)theIdentifier
    {
        __block NSView *subView = nil;
        [[self subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    #pragma unused(idx)
            if ([[obj identifier] isEqualToString:theIdentifier]) {
                subView = obj;
                *stop = YES;
            }
        }];
        return subView;
    }
    

    对不起,不起作用;试过了。绑定列仅适用于基于单元格的表。不是基于视图的表。