我仍然在我的小Cocoa应用程序中苦苦寻找基于视图的NSOutlineView。我正在尝试使用finder之后模拟我的OutlineView。当Finder OutlineView失去焦点(例如,单击右侧的任何文件夹)时,所选行(例如桌面)将保持选中,使用亮蓝色渐变,并且不会更改为无效的蓝灰色渐变。
我想在我的应用程序中复制此行为。
在基于非视图的OutlineView中,我能够继承NSOutlineView并重新实现(void)highlightSelectionInClipRect:(NSRect)clipRect
,这样每个突出显示的行都可以提供明亮的蓝色背景图像。
但是,现在使用基于视图的OutlineView(设置为SourceList样式),这个方法显然甚至都没有被调用。我甚至已经实现了(id)_highlightColorForCell:(NSCell *)cell
以返回零,正如一些网站建议的那样,但这也无济于事。
关于如何在基于视图的OutlineView中设置高光渐变的任何提示?
答案 0 :(得分:8)
你在做任何可能搞乱事情的自定义绘图吗?据我所知,所有的选择绘图都是正常处理的,请查看TableViewPlayground example(默认情况下不是源列表样式,但这是对XIB的简单更改)。
但是失败了,根据highlightSelectionInClipRect:
注意:对于基于视图的表视图,不应对此方法进行子类化或重写。 相反,行绘制自定义应该通过继承NSTableRowView来完成。
所以我认为(我还没有尝试过任何一个)就像你想要继承NSTableRowView,覆盖drawSelectionInRect:
(TableViewPlayground中有一个example,并绘制你的选择。你可以查看对于使用[NSApp active]
处于活动状态的应用,或者像示例一样使用self.emphasized
属性。
然后,您将在NSOutlineViewDelegate协议方法中返回一个自定义NSTableRowViews(仅限10.7!):(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item
希望这有效/有帮助!
我应该注意TableViewPlayground示例默认使用outlineView:viewForTableColumn:item:
委托方法并使用NSTableViewCells执行所有操作,但是如果您添加我在上面提到的rowViewForItem
方法,则 被调用。所以我猜你可以用它来为它的每一行返回一个视图。
答案 1 :(得分:6)
谢谢你的提示,我能够很容易地解决问题。我将NSTableRowView
子类化并覆盖-(BOOL) isEmphasized
以始终返回true。
然后我在我的OutlineViews委托中实现-(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item
,通过调用ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];
编辑:除此之外,通过将新的NSView对象放入Interface Builder中的OutlineView,似乎还有一种非常隐蔽的方式来使用自定义NSTableRowView子类。然后根据Apple documentation将views类设置为子类,并为其指定用户接口项标识符“NSTableViewRowViewKey”。