7

我想用自定义的 NSTableCellViews 创建一个 NSTableview。

这是我现在所拥有的:

  • 名为CustomCell.xib的单元格(视图 nib)的 nib 文件
  • 我的单元格的自定义类称为CustomCell
  • 我的AppDelegate.m中的代码:

在这里,我以编程方式创建表视图:

    NSScrollView *tableContainer = [[NSScrollView alloc]initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)];
    NSTableView *tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)];

    NSTableColumn *firstColumn = [[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"] autorelease];
    [[firstColumn headerCell] setStringValue:@"First Column"];
    [tableView  addTableColumn:firstColumn];

    tableView.dataSource = self;
    tableView.delegate = self;
    [tableContainer setDocumentView:tableView];
    tableContainer.autoresizingMask = NSViewHeightSizable | NSViewMinXMargin;
    [self.window.contentView addSubview: tableContainer];

这是我想放置自定义单元代码的委托方法:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {


    // In IB the tableColumn has the identifier set to the same string as the keys in our dictionary
    NSString *identifier = [tableColumn identifier];

    if ([identifier isEqualToString:@"myCell"]) {

        // We pass us as the owner so we can setup target/actions into this main controller object
        CustomCell *cellView = [tableView makeViewWithIdentifier:identifier owner:self];
        // Then setup properties on the cellView based on the column
        cellView.textField.stringValue = @"Name";
        return cellView;
    }
    return nil;
}

在我的自定义单元格的 nib 文件中,我已将单元格视图与名为CustomCell的自定义类连接起来,该类是NSTableCellView的子类。到目前为止,我还没有完成任何其他步骤。所以我的CustomCell.m只是默认的初始化代码。我没碰过。而且我没有在我的 nib 文件中做任何其他事情,所以我没有更改文件的所有者或类似的东西,因为我真的不知道该怎么做。任何人都可以帮忙吗?我查看了 Apple 文档中的示例文件,但经过几天的研究,我没有找到任何解决方案。如果您能帮助我,我将不胜感激。

4

2 回答 2

3

这就是我最终做的事情:

当然,你必须继承 NSTableCellView 并像我在下面那样返回它。如果您熟悉 iOS 中的表格视图,您应该熟悉以下方法:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
    //this will be called first. It will tell the table how many cells your table view will have to display
    return [arrayToDisplay count];

}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    //this is called after the count of rows is set. It will populate your table according to the data your array to display contains

    [tableView setTarget:self];
    [tableView setAction:@selector(click)];

    NSString *identifier = [tableColumn identifier];

    if ([identifier isEqualToString:@"TheCell"]) {

        CustomCell *cellView = [tableView makeViewWithIdentifier:identifier owner:self];
        cellView.cellText.stringValue = [arrayToDisplay objectAtIndex:row];
        return cellView;
    }

    return nil;
}

选择行时触发的click方法如下所示:

-(void)click{

    int index = [table selectedRow];

    // Do something with your data 
    //e.g
    [[arrayToDisplay objectAtIndex:index] findHiggsBoson]; 

}

还有一些必须添加到 NSTableView 中的东西:

NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"];
column.width = self.frame.size.width;
[tableView addTableColumn:column];
于 2013-04-13T17:41:23.117 回答
1

你不需要继承 NSTableView 来拥有自定义的 NSTableViewCell 子类。您也可以考虑使用基于视图的表视图...

于 2013-01-05T13:26:21.870 回答