在NSTableCellView

时间:2016-12-14 02:46:08

标签: objective-c macos nstableview

您好我正在尝试在我的程序中使用NSTableView,我在设置NSTableCellView的值并让它们在NSTableView中显示时遇到问题。当我运行我的程序时,只显示空白单元格。使用NSLog,我可以看到单元格imageView被设置,但不显示。当我为NSTableCellViews设置stringValues时,尽管包含数据的字符串,我只从NSLog中获取null。这是我遇到问题的委托方法:

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

    NSString *cellIdentifier;
    NSImageView *pageImageView;
    NSString *pageString;

    int pageVotes;

    if (_connectionArray.count == 0) {
        return nil;
    }

    NSTableCellView *cellView = [[NSTableCellView alloc] init];

    if (tableColumn == tableView.tableColumns[0]) {
        cellIdentifier = @"firstColumn";
        pageImageView = [[_connectionArray objectAtIndex:row] getImage]; //Gets imageView from Page Object
        cellView.imageView = pageImageView; //Set image view for cell
        NSLog(@"%@", cellView.imageView); //This works
    }
    if (tableColumn == tableView.tableColumns[1]) {
        cellIdentifier = @"secondColumn";
        pageString = [[_connectionArray objectAtIndex:row] getTitle];
        cellView.textField.stringValue = pageString; //Set text for cell
        NSLog(@"%@", cellView.textField.stringValue); //Does not work, returns null
    }
    if (tableColumn == tableView.tableColumns[2]) {
        cellIdentifier = @"thirdColumn";
        pageVotes = [[_connectionArray objectAtIndex:row] getVotes];
        pageString = [NSString stringWithFormat:@"%i", pageVotes]; //Convert int to string
        cellView.textField.stringValue = pageString; //Set text for cell. 
        NSLog(@"%@", cellView.textField.stringValue); //Does not work, returns null
    }

    [_tableView makeViewWithIdentifier:cellIdentifier owner:self];

    return cellView;

}

我认为Storyboard和ViewController之间的所有设置都是正确的,但我很可能错了,因为这是我第一次使用NSTableViews。我也尝试过使用:

[cellView setImage:pageImageView];
[cellView setTextField:[NSTextField textFieldWithString:pageString]];

但我遇到了同样的问题。如果有人可以帮助我,我非常感激!我觉得我错过了一些简单的事情......

1 个答案:

答案 0 :(得分:2)

设置textField的{​​{1}}和imageView属性不会向单元格视图添加文本字段或图像视图。这些出口仅用于通知单元视图,其中哪些子视图是主要文本字段和/或主要图像视图。您仍然有责任将这些视图作为子视图添加到单元格视图中,或者可能作为更深层次的后代视图。

此外,您的模型出售视图是个坏主意。这不是它应该如何运作。除此之外,这将特别干扰将这些视图添加到单元视图的子视图层次结构中。

同样奇怪的是,您既要创建单元格视图又要求表格视图(通过调用NSTableCellView)。通常情况下,您可以执行其中一个操作,或首先尝试-makeViewWithIdentifier:owner:并仅在失败时创建视图。当然,你不会忽略返回值。

坦率地说,最好的办法是在Interface Builder中设置这一切。如果你做对了,就根本不需要实现-makeViewWithIdentifier:owner:。你没有走那条路吗?