基于视图的NSOutlineView标题单元格字体问题

5

我正在尝试在我的Cocoa应用程序中使用一个新的基于视图的NSOutlineView。由于我没有使用绑定,所以我在控制器中实现了所有必需的代理和数据源方法。

在接口构建器中,我添加了一个NSOutlineView,并将高亮设置为SourceList,内容模式设置为View Based。因此,提供了两个默认的表格单元视图(一个标题单元格与标识符HeaderCell设置为标识符,一个数据单元格与标识符DataCell设置为标识符)

这是在界面构建器中的样子,标题单元格视图正确显示灰蓝色的textField,而数据单元格视图具有图像视图和带有正确颜色和字体设置的textField

为了提供视图,我使用以下代码返回DataCell-view或HeaderCell-view,并根据在接口构建器中设置的相应标识符设置单元格的textField。

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


    NSTableCellView *result = nil;

    if ([item isKindOfClass:[NSMutableDictionary class]]) {
        result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];

        id parentObject = [outlineView parentForItem:item] ? [outlineView parentForItem:item] : groupedRoster;
        [[result textField] setStringValue:[[parentObject allKeys] objectAtIndex:0]];


    } else {
        result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];

        [item nickname] ? [[result textField] setStringValue:[item nickname]] : [[result textField] setStringValue:[[item jid] bare]];
    }
    return result;
}

运行一切看起来像下面这样。

有人能给我一些提示,为什么当选中标题单元格时,它既不加粗,也没有正确的颜色?

2个回答

12

你需要实现 -outlineView:isGroupItem: 代理方法,并对头部行返回 YES。这将标准化字体并将左侧的披露三角形替换为右侧的显示/隐藏按钮。你仍然需要手动将字符串转换为大写以获得完整效果。

我不确定上面的组行代理方法是否能使选择样式看起来好或不好。不过,通常在源列表中你不希望头部行可以被选中,你可以通过从 -outlineView:shouldSelectItem: 代理方法对头部项目返回 NO 来实现。


2
非常感谢,这正是我所需要的。如果其他人遇到同样的问题,请使用setFloatsGroupRows:NO来防止第一个组项目在展开和折叠时上下跳动,根据此帖子 - BinaryBucks
虽然现在一切都显示正确,但是上面的代码在展开/折叠组时并不真正流畅,例如在Finder中。动画总是有轻微但明显的卡顿和相当重的CPU负载,就好像视图是新分配的一样。如果我只使用一个标识符的makeViewWithIdentifer,使每个单元格都是标题单元格(或数据单元格,这无关紧要),则一切都可以流畅地工作。有什么提示吗? - BinaryBucks
是的,整个floatsGroupRows属性对于大纲视图来说都是有问题的。我并没有看到你描述的性能问题。也许是来自一个图层支持的父视图的核心动画回归?我不知道。 - Boaz Stuller

3
我创建了一个小型样例项目,其中包含源列表,并且按照@boaz-stuller的建议使用了-outlineView:isGroupItem:方法。
  • 显示项目列表
  • 以主从式编辑项目
  • 删除和添加项目
  • 使用绑定
请查看github上的besi/mac-quickies。大部分内容都是在IB中完成的,或者可以在AppDelegate中找到。

screenshot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接