【问题标题】:Programmatically creating an NSTableView (trouble getting the NSHeaderView to show up)(cocoa osx)以编程方式创建一个 NSTableView(让 NSHeaderView 出现问题)(cocoa osx)
【发布时间】:2011-06-03 17:45:18
【问题描述】:

我正在以编程方式制作 NSTableView,但出于某种原因,无论我做什么,我都无法让该死的 headerView 显示出来。我必须以编程方式执行此操作而不使用 IB,因为我实际上是在一个名为 clozure cl 的 IDE 中开发此小部件,该 IDE 是一个包含可可桥的 lisp ide。最初我认为这个问题可能是由我的开发环境引起的,但我只是在 Xcode 中仅使用目标 C 创建了一个示例,似乎问题仍然存在。我所做的很简单:

我在 IB 中创建一个窗口,并在其 awkefromnib 方法中创建并设置了一个表格视图,代码如下:

- (void)awakeFromNib {
mydatasource *data = [[mydatasource alloc] init];
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"];
NSTableView *table = [[NSTableView alloc] initWithFrame: [[self                      

   contentView]frame]];
[table setDataSource:data];
[table addTableColumn:column];
[table addTableColumn:column];
[[self contentView] addSubview:table];
}

这是我的数据源对象的代码:

- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
printf("NUM ROwS");
    return 4;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn    *)aTableColumn row:(NSInteger)rowIndex
{
 printf("THE OTHER ONE"); 
 return @"OKAY";
}

使用此代码,我得到一个包含两列和四行的窗口,每个单元格显示字符串“OKAY”,这一切都很好,除了表格没有标题。这可能是有意义的,除非当我查看表头方法时,它有一个初始化的头和一个值有意义的框架。我只是想知道为什么我看不到它。我需要做一些特殊的魔法来显示标题吗?我似乎在文档中找不到任何线索。再一次,lisp ide 必须以编程方式完成此操作,因此不建议使用我知道将具有工作 headerView 的 IB 将无济于事。非常感谢。

【问题讨论】:

    标签: objective-c macos cocoa nstableview


    【解决方案1】:

    我写了这个 Swift 版本的 @Alex Nichol 的回答:

        let tableContainer = NSScrollView(frame:NSMakeRect(10, 10, 380, 200))
        let tableView = NSTableView(frame:NSMakeRect(0, 0, 364, 200))
        let column1 = NSTableColumn(identifier: "Col1")
        let column2 = NSTableColumn(identifier: "Col2")
        column1.width = 252
        column2.width = 198
        tableView.addTableColumn(column1)
        tableView.addTableColumn(column2)
        tableView.setDelegate(self)
        tableView.setDataSource(self)
        tableView.reloadData()
        tableContainer.documentView = tableView
        tableContainer.hasVerticalScroller = true
        window.contentView.addSubview(tableContainer)
    

    成功了。

    【讨论】:

    • 需要对最新的 swift 进行细微更改,但它可以工作!
    • 如果你实现这个并添加到一个有约束的视图中,NSMakeRect 的值是无关紧要的,但由于唯一的其他初始化是与编码器,你必须使用它。
    【解决方案2】:

    这是一些以编程方式创建带有滚动条和多列的表格视图的代码。

    // create a table view and a scroll view
    NSScrollView * tableContainer = [[NSScrollView alloc] initWithFrame:NSMakeRect(10, 10, 380, 200)];
    NSTableView * tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, 364, 200)];
    // create columns for our table
    NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"Col1"];
    NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"Col2"];
    [column1 setWidth:252];
    [column2 setWidth:198];
    // generally you want to add at least one column to the table view.
    [tableView addTableColumn:column1];
    [tableView addTableColumn:column2];
    [tableView setDelegate:self];
    [tableView setDataSource:self];
    [tableView reloadData];
    // embed the table view in the scroll view, and add the scroll view
    // to our window.
    [tableContainer setDocumentView:tableView];
    [tableContainer setHasVerticalScroller:YES];
    [[self contentView] addSubview:tableContainer];
    [tableContainer release];
    [tableView release];
    [column1 release];
    [column2 release];
    

    只是想我会为仍在寻找直截了当答案的任何人发布此消息。 :)

    【讨论】:

    • 谢谢!我有一个 XIB 表视图,它拒绝获取单元格,并且不期待手动将其转换为代码。
    • 只是一个注释。将表格视图嵌入到滚动视图中对于正确显示包括标题在内的所有内容至关重要。
    • 在下方添加了快速转换
    【解决方案3】:

    好吧,我回答了我自己的问题,我认为这可能对其他人有帮助,似乎只有将 tableview 添加到滚动视图时,headerView 才会显示。

    【讨论】:

    • 我想我可以回答你的问题:NSTableHeaderView 是一个完全不同的观点(和阶级)。如果你拖出一个 NSTableView 集,它只是 IB 会自动将它扔给你。我认为 IB 应该更清楚地了解此类“视图集”附带哪些视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多