2011-03-24 47 views
1

我有一個程序帶有一個NSOutlineView(支持單一選擇),我希望能夠拖動元素。這些元素應該作爲文本或文件接收:例如,將項目放在TextEdit窗口上應該放置文本,但是將項目放在Finder上應該創建一個文件。我不想在我的大綱視圖上放下任何東西,即使它來自它本身。這似乎很容易,但由於某種原因,我無法讓它工作。NSOutlineView元素仍然無可救藥地不可裁剪

我檢查了NSOutlineView阻力和來自蘋果掉落例子,我來實現以下方法(加上一些絕對無關的內容):

-(BOOL)outlineView:shouldSelectItem: // I don't expect to drag unselectable items 
-(NSArray*)outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems: 
-(BOOL)outlineView:writeItems:toPasteboard: 

然而,當我試圖從拖動項目我大綱視圖,沒有任何反應。相反,它只是改變光標後面的選擇。

我已經把斷點放在最後兩個方法中,並且它們永遠不會被調用,所以它們的實現不是直接的問題。

我必須在這裏丟失一些非常明顯的東西。

此外,這還不是一個問題,但我該如何提供內容到我承諾的文件?

回答

2

我當時很蠢,而且我在委託中實現了方法,而不是數據源(兩者在我的應用程序中截然不同)。問題解決了!

1

您是否使用自定義表格視圖單元格? NSCell的hitTestForEvent:inRect:ofView:的結果決定是否可以啓動拖動操作。它也決定你是否應該調用你的outlineView:writeItems:toPasteboard:

此方法應返回NSCellHitContentArea來啓動拖動或NSCellHitTrackableArea來擴展或更改選擇。

標準文本單元格在單擊單元格的實際文本時返回NSCellHitContentArea,而當您單擊文本外部時則返回NSCellHitTrackableArea。這會產生您在Finder的表格視圖中看到的拖動行爲。

如果希望單元格的所有區域都啓動拖動操作,則可以覆蓋此方法並始終返回NSCellHitContentArea

查看Hit Testing瞭解更多信息。

+0

感謝您的時間,這可能會在稍後派上用場;然而,我知道我今晚在火車上做錯了什麼。無論如何,請爲此付出努力+1。 – zneak 2011-03-24 22:26:41