基于视图的NSOutlineView选择渐变

5
我在我的Cocoa小应用中仍然在苦苦挣扎着处理基于视图的NSOutlineView。我试图模仿Finder OutlineView的行为。当Finder OutlineView失去焦点时(例如,在右侧点击任意文件夹),所选行(例如,桌面)保持选定状态,并且不会更改为非活动状态下的蓝灰色渐变色。
我想在我的应用程序中复制这种行为。
在非基于视图的OutlineView中,我能够子类化NSOutlineView并重新实现(void)highlightSelectionInClipRect:(NSRect)clipRect,以便可以为每个突出显示的行提供亮蓝色背景图像。
然而,现在与我的基于视图的OutlineView(设置为SourceList样式)一起使用时,该方法显然甚至没有被调用。我甚至实现了(id)_highlightColorForCell:(NSCell *)cell来返回nil,因为一些网站建议如此,但这也没有帮助。
有关如何在基于视图的OutlineView中设置高亮渐变色的提示吗?

我也遇到了这个问题。 - tofutim
2个回答

8
你是否正在做任何可能会影响选择的自定义绘制操作?据我所知,所有的选择绘制操作通常都是由系统处理的。你可以查看TableViewPlayground示例(默认情况下不是源列表样式,但XIB可以方便地进行更改)。

但如果还是没有解决问题,根据Mac OS X 10.7文档中关于highlightSelectionInClipRect:的描述:

注意:这个方法不应该为基于视图的表视图子类化或重写。相反,应该通过子类化NSTableRowView来进行行绘制自定义。

因此,我认为(我还没有尝试过任何方法),你需要子类化NSTableRowView,重写drawSelectionInRect:(在TableViewPlayground中有一个示例),并绘制你的选择内容。你可以使用[NSApp active]来检查应用程序是否处于活动状态,或者像示例那样使用self.emphasized属性。

然后,你需要在NSOutlineViewDelegate协议方法(仅10.7!)中返回一个自定义的NSTableRowView:(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item

希望这能解决或帮助你的问题!

需要注意的是,TableViewPlayground示例默认使用outlineView:viewForTableColumn:item:委托方法并通过NSTableViewCells完成所有操作,但如果添加我上面提到的rowViewForItem方法,它确实会被调用。因此,我猜你可以使用它为每一行返回一个视图。


6

谢谢,有了您的提示,我很容易地解决了这个问题。我子类化了NSTableRowView并重写了-(BOOL) isEmphasized方法,让它始终返回true。

然后,在我的OutlineViews代理中实现了-(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item方法,通过调用ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];来返回一个特定于项目的子类实例。

编辑:此外,还有一种非常隐藏的使用自定义NSTableRowView子类的方法,就是在Interface Builder中将一个新的NSView对象拖放到OutlineView中。然后将视图类设置为您的子类,并根据Apple文档中的说明,将其用户界面项目标识符设置为“NSTableViewRowViewKey”。


+1 针对 "NSTableViewRowViewKey"。我花了一些时间才找到它。确实相当隐蔽。 - Just a coder

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