【问题标题】:View-based NSOutlineView header cell font issues基于视图的 NSOutlineView 标题单元格字体问题
【发布时间】:2011-08-17 17:46:18
【问题描述】:

我目前正在尝试在我的 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;
}

运行一切,如下所示。

谁能给我提示,为什么标题单元格在被选中时既不粗体也不正确着色?

【问题讨论】:

    标签: cocoa macos nsoutlineview


    【解决方案1】:

    您需要实现 -outlineView:isGroupItem: 委托方法并为您的标题行返回 YES。这将标准化字体并将左侧的显示三角形替换为右侧的显示/隐藏按钮。您仍然需要手动将字符串大写以获得完整效果。

    我不确定上面的组行委托方法是否使选择样式看起来不错。但是,您通常不希望在源列表中完全可以选择标题行,您可以通过从 -outlineView:shouldSelectItem: 委托方法中为标题项返回 NO 来选择标题行。

    【讨论】:

    • 太好了,谢谢,这正是我想要的。万一其他人遇到问题,使用 setFloatsGroupRows:NO 防止第一个分组项在根据this post展开和折叠时上下跳动
    • 虽然我现在在这里并且所有内容都正确显示,但上述代码在展开/折叠组时并不能真正流畅地工作,例如发现者。动画中总是有轻微但明显的卡顿和相当重的 CPU 负载,就好像视图是新分配的一样。如果我只是将 makeViewWithIdentifer 与单个标识符一起使用,那么每个单元格都是标题单元格(或数据单元格,这无关紧要),那么一切都可以流畅运行。任何提示为什么?
    • 是的,整个 floatsGroupRows 属性对于大纲视图都被破坏了。没有看到你描述的性能问题。也许是来自 layer-backed superview 的 Core Animation 回归?不知道。
    【解决方案2】:

    我创建了一个小示例项目,其中包括一个源列表,并且还按照@boaz-stuller 的建议使用了-outlineView:isGroupItem: 方法。

    • 显示项目列表
    • 以主从方式编辑项目
    • 删除和添加项目
    • 绑定的使用

    在 github 上查看 besi/mac-quickies。 大部分东西要么在 IB 中完成,要么可以在 AppDelegate 中找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2012-06-23
      • 2011-10-21
      • 2023-03-26
      相关资源
      最近更新 更多