使用NSOutlineView和NSTableCellView实现基本源列表

时间:2011-08-17 00:52:08

标签: cocoa nsoutlineview

我是Cocoa的新手,但我是一位经验丰富的程序员(主要是C,C ++,.NET和QT)。我正在努力实现一个源列表,这是您通常在finder和iTunes中看到的侧边栏。我试图使用一个非常基本的测试用例。所以没有CoreData,没有TreeController等......

我实现了NSOutlineViewDataSource。这是我的代码:

@implementation OutlineViewDataSource

- (id)init
{
    self = [super init];
    if (self) {

        header = [[NSString alloc] initWithString: @"Header"];
        child1 = [[NSString alloc] initWithString: @"Child 1"];
        child2 = [[NSString alloc] initWithString: @"Child 2"];
        child3 = [[NSString alloc] initWithString: @"Child 3"];
    }

    return self;
}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
    if (item == nil)
    {
        return header;
    }
    else
    {
        if (index == 0)
        {
            return child1;
        }

        if (index == 1)
        {
            return child2;
        }

        if (index == 2)
        {
            return child3;
        }
    }

    return nil;
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
    if (item == nil)
    {
        return YES;
    }

    if (item == header)
    {
        return YES;
    }

    return NO;
}

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
    if (item == nil)
    {
        return 1;
    }

    if (item == header)
    {
        return 3;
    }

    return 0;
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item 
{
    if (item == nil)
    {
        return @"";
    }

    return item;
}

@end

我的xib文件是基本的。它只是一个源列表(这是一个配置为看起来像源列表的NSOutlineView。它还附带了两个预配置的NSTableCellView。我连接了数据源和代理。

如果我运行此代码并将源列表配置为基于单元格,它按预期工作....但显然只显示文本而不是NSTableCellViews。如果我将源列表配置为基于视图,我会得到奇怪的行为。 NSTableCellViews不显示。但是扩展按钮可以,我可以选择正确数量的项目,就像它们在那里一样。也没有文字出现。此外,objectValueForTableColumn函数不会执行。如果我将另一个NSTableCellView添加到xib中的源列表,NSTableCellView会显示,但我无法更改其中的图标或文本,objectValueForTableColumn仍然无法执行。我试图实现viewForTableColumn,但该函数也从未调用过。

我做错了什么。我觉得我很亲密,但我遗漏了一些基本的东西。提前致谢。

1 个答案:

答案 0 :(得分:-1)

这是viewForTableColumn未被调用的症状。它确实需要完成它的工作,否则你会得到空白的细胞。我遇到了同样的问题。

确定您的NSOutlineView的委托是否绑定到任何类实现viewForTableColumn?