基于视图的NSOutlineView中的空单元格

时间:2014-02-20 10:28:29

标签: objective-c cocoa nstableview nsoutlineview

更新:链接到源完整源代码(download

我正在尝试实现基于视图的NSOutlineView(Sourcelist),但我遇到了问题。为了说明,我创建了一个简约的例子。

我有一个名为Person的简单类。每个人都有一个名字(NSString),也许还有一些孩子(NSArray)。我添加了一个NSOutlineView,将它连接到IBOutlet,将自己设置为DataSource,并实现了NSOutlineViewDataSource方法。

首先考虑基于CELL的NSOutlineView的情况:

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
    // We are at the root
    if (!item)
    {
        return [self.persons count];

    }

    // We are at an internal node
    Person *person = (Person *)item;
    return [person.children count];
}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
    // We are at the root
    if (!item)
    {
        return self.persons[index];
    }

    // We are at an internal node
    Person *person = (Person *)item;
    return person.children[index];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
    Person *person = (Person *)item;
    if ([person.children count] > 0)
    {
        return YES;
    }
    return NO;
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    Person *person = (Person *)item;
    return person.name;
}

它的工作方式与我预期的一样:

enter image description here

但是,如果我将NSOutlineView更改为基于VIEW,则情况会有所不同。现在所有名称都被“Table View Cell”替换。我试图通过返回NSTableCellView来解决问题:

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    Person *person = (Person *)item;

    NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"PersonCell" owner:self];
    tableCellView.textField.stringValue = person.name;

    return tableCellView;
}

如果不做进一步的更改,这不会改变任何事情。当我将NSOutlineView中的TableCellView的标识符更改为PersonCell时,

enter image description here enter image description here

所有单元格最终都是空的。实际上,在outlineView:objectValueForTableColumn:byItem:function中添加一个简单的NSLog语句会显示该函数甚至从未被调用过。

这个方法对我来说对标准的NSTableViews有用,而且由于NSOutlineView是NSTableView的子类,所以我期待这里有相同的行为。

非常感谢任何帮助。

谢谢!

/ Michael Knudsen

1 个答案:

答案 0 :(得分:3)

我认为为每行返回正确视图对象的相应方法是

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item

而不是

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

在基于视图的表视图中返回视图,而不是objectValue。

所以应该使用:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
    Person *person = (Person *)item;
    NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"PersonCell" owner:self];
    tableCellView.textField.stringValue = person.name;

    return tableCellView;
}