2011-08-27 41 views
5

我仍然在基於視圖的NSOutlineView在我的小可可應用程序中掙扎。我試圖在發現者之後建模我的OutlineView。當Finder OutlineView失去焦點(例如,單擊右側的任何文件夾)時,選定的行(例如桌面)將保持選擇,並且亮藍色漸變,並且不會更改爲非活動的藍灰色漸變。基於視圖的NSOutlineview選擇漸變

我想在我的應用程序中複製此行爲。

在基於非基於視圖的OutlineView中,我能夠繼承NSOutlineView並重新實現(void)highlightSelectionInClipRect:(NSRect)clipRect,這樣每個突出顯示的行都可以與明亮的藍色背景圖像一起提供。

但是,現在用我的基於視圖的OutlineView(設置爲SourceList樣式),這種方法顯然甚至沒有被調用。我甚至實施了(id)_highlightColorForCell:(NSCell *)cell返回零,因爲一些網站建議,但這也沒有幫助。

有關如何在基於視圖的OutlineView中設置高光漸變的提示?

+0

我有這個確切的問題。 – tofutim

回答

8

你在做任何自定義繪圖可能會搞砸的東西嗎?據我所知,通常所有的選擇圖都是爲您處理的,請查看TableViewPlayground example(默認情況下不是Source-list樣式,但這對XIB是一個簡單的改變)。

但是做不到這一點,根據上highlightSelectionInClipRect:

注Mac OS X的10.7文檔條目:該方法不應當被繼承或重寫爲視圖基表視圖。 相反,行繪製自定義應該通過繼承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方法我提到它上面調用。所以我猜你可以用它來返回整個視圖中的每一行。

6

謝謝,隨着你的提示,我能夠很容易地解決這個問題。我將NSTableRowView分類並覆蓋-(BOOL) isEmphasized以始終返回true。

然後我在我的OutlineViews委託實施-(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item通過調用ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];

編輯回到我的子類的對象特定實例:除此之外,還有似乎也是使用自定義NSTableRowView子類的非常隱蔽的方式通過將新的NSView對象放入Interface Builder中的OutlineView中。然後根據Apple documentation,將views類設置爲您的子類併爲其提供用戶界面項標識符「NSTableViewRowViewKey」。

+0

+1表示「NSTableViewRowViewKey」。花了我一些時間來發現。這確實很隱蔽 –

相關問題