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

Ria*_*inn 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

我究竟做错了什么。我觉得我很接近,但我缺少一些基本的东西。提前致谢。

jjs*_*jjs -1

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

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