2011-08-17 70 views
5

我目前正在尝试在我的Cocoa应用程序中使用新的基于视图的NSOutlineView。由于我没有使用绑定,所以我在我的控制器中实现了所有必需的委托和数据源方法。基于视图的NSOutlineView标题单元格字体问题

在Interface Builder我添加了一个NSOutlineView设置为SOURCELIST并设置为查看基于内容模式突出显示。因此,有提供两个缺省表格单元视图(与HeaderCell集作为标识符和与DATACELL组作为标识符的一个数据小区的一个标题单元格)

这就是它看起来像在界面生成器,头单元格的观点正确显示灰蓝色的TextField而数据单元的观点具有图像视图和文本字段与正确颜色和字体设置

为了提供的意见,我使用下面的代码,返回一个DataCell-视图或HeaderCell视图和集合根据界面生成器中设置的相应标识符,相应单元格的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; 
} 

运行它看起来如下所示。

任何人都可以提供提示,为什么选择时标题单元既不是粗体也不是正确的颜色?

回答

11

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

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

+1

很好,谢谢发现,这正是我一直在寻找。如果有人遇到问题,请根据[本文](http:// stackoverflow。)展开和折叠时使用setFloatsGroupRows:NO来防止第一个组项目*跳跃*上下。COM /问题/ 6814620 /奇怪的行为 - 使用 - 视图 - 基于nsoutline-SOURCELIST) – BinaryBucks

+0

虽然我现在它是一切正确显示上面的代码工作并没有真正流利工作展开/折叠一群喜欢它,当是例如发现者。在动画中总会有轻微但明显的停顿,并且CPU负载很重,就好像视图是新分配的一样。如果我只用一个标识符来使用makeViewWithIdentifer,那么每个单元格都是一个标题单元格(或数据单元格,它不会马上),一切都很流畅。任何暗示为什么? – BinaryBucks

+0

是的,整个floatsGroupRows属性刚刚为大纲视图断开。没有看到你描述的性能问题。也许是来自层级支持的超级视图的Core Animation回归?不知道。 –

2

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

  • 显示项目的列表
  • 编辑在一个主 - 从时尚的项目
  • 删除和添加项目
  • 绑定在github

退房besi/mac-quickies的用法。 大部分的东西在IB:做或可以在AppDelegate

screenshot