首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以编程方式向基于视图的NSTableView添加列(带有绑定)?

以编程方式向基于视图的NSTableView添加列(带有绑定)?
EN

Stack Overflow用户
提问于 2013-08-30 22:19:05
回答 1查看 4.6K关注 0票数 9

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

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

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

为了简单起见,假设这个设置:

  1. 模型对象是普通对象,只有一个NSString属性:name
  2. AppDelegate具有一个NSArray属性(models),它包含许多模型实例。
  3. NSArrayController的content绑定到应用程序委托的models数组。
  4. NSTableView的content绑定到数组控制器的arrangedObjects
  5. 表的第一列被绑定(在IB中)以显示name属性,即列→表单元格视图→静态文本表视图单元格单元格值绑定到表单元格视图的objectValue.name

据我所知,这是一本直截了当的书,它的作用就像一种魅力。

但是.我怎么添加更多的列呢?

要以编程方式添加列(为了保持它的简单性,假设这个新列也应该显示name属性,就像已经存在的列一样),我想我应该在应用程序委托中这样做:

代码语言:javascript
运行
复制
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实例是基于单元格的,而不是基于视图的,这会带来麻烦。但是,我不知道如何从这里开始,而且文档从不讨论以编程方式添加的绑定列。

在这种情况下,我所需要的只是一个简单的文本列,绑定到模型,就像我可以轻松设置IB的那个。

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

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-12-02 13:32:26

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

代码语言:javascript
运行
复制
- (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分类方法:

代码语言:javascript
运行
复制
- (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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18542259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档