NSOutlineView元素仍然无可救药地无法实现

时间:2011-03-24 17:24:06

标签: objective-c cocoa drag-and-drop nsoutlineview

我有一个带有NSOutlineView的程序(仅支持单选),我希望能够拖动元素。这些元素应该作为文本或文件接收:例如,在TextEdit窗口中删除项目应该放置文本,但是在Finder上删除项目应该创建一个文件。我不希望任何东西掉在我的大纲视图上,即使它来自它自己。这似乎很容易,但由于某种原因,我无法让它发挥作用。

我检查了Apple的NSOutlineView拖放示例,然后我开始实现以下方法(加上一些绝对不相关的方法):

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

但是,当我尝试从大纲视图中拖动项目时,没有任何反应。相反,它只是更改光标后面的选择。

我在最后两种方法中加入了断点,并且它们永远不会被调用,所以它们的实现并不是当前的问题。

我必须在这里找到一些非常明显的东西。

此外,这还不是问题,但我应该如何向我承诺的文件提供内容?

2 个答案:

答案 0 :(得分:2)

我是愚蠢的,我在委托中实现了方法而不是数据源(这两个在我的应用程序中是不同的)。问题解决了!

答案 1 :(得分:1)

您使用的是自定义表格视图单元格吗? NSCell的hitTestForEvent:inRect:ofView:的结果确定是否可以启动拖动操作。它还确定是否应调用outlineView:writeItems:toPasteboard:

此方法应返回NSCellHitContentArea以启动拖动,或NSCellHitTrackableArea以扩展或更改选择。

当您单击单元格的实际文本时,标准文本单元格会返回NSCellHitContentArea,而当您单击文本外部时,NSCellHitTrackableArea会返回NSCellHitContentArea。这会产生您在Finder表视图中看到的拖动行为。

如果您希望单元格的所有区域都启动拖动操作,则可以覆盖此方法并始终返回{{1}}。

有关详细信息,请参阅Hit Testing