outlineView:objectValueForTableColumn:byItem:未调用

Joh*_*nes 5 cocoa objective-c nsoutlineview

我正在尝试为新程序创建一个源列表,并且我在使用基于视图的NSOutlineView时遇到了一些问题.我的代码使用基于单元格的NSOutlineView工作正常,所以我对发生的事情有点困惑.

这是代理和数据源的代码:

#pragma mark -
#pragma mark NSOutlineView Delegate

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
    return (item == nil) ? YES : [(SourceListNode *)item groupItem];
}

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    if ([(SourceListNode *)item groupItem]) {
        return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
    }
    else {
        return [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
    }
}

#pragma mark -
#pragma mark NSOutlineView Data Source

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
    return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
    return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0);
}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
    return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index];
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    return [(SourceListNode *)item name];
}
Run Code Online (Sandbox Code Playgroud)

当我通过调试器运行它时,它看到outlineView:objectValueForTableColumn:byItem:它不会执行.结果是没有文本的大纲视图.创建了正确的单元格,我可以选择它们并展开它们.我错过了什么?

更新:我在IB中删除了我的源列表,添加了一个新的源列表,并将其连接到我的控制器对象.结果更好,但标题细胞具有文本"HEADER CELL"并且子细胞具有"Table View Cell".

我再次通过调试器运行程序,这次outlineView:objectValueForTableColumn:byItem:执行了.但它没有填充单元格的文本.

然后我更新outlineView:viewForTableColumn:item:如下:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    NSTableCellView *result;
    if ([(SourceListNode *)item groupItem]) {
        result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
    }
    else {
        result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
    }

    [[result textField] setStringValue:[(SourceListNode *)item name]];

    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作.

总之,我已经解决了我的问题.但是,我现在有另一个问题.outlineView:objectValueForTableColumn:byItem:基于视图的大纲视图的目的是什么?它执行,但似乎没有做任何事情.

evd*_*100 4

基于视图与基于单元格略有不同。

所不同的只是将“id”返回值替换为“NSView”。

改变这个:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
Run Code Online (Sandbox Code Playgroud)

对此:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
Run Code Online (Sandbox Code Playgroud)

这是假设您正在运行 10.7,并且您实际上返回一个 NSView。