1

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

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

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

但是,当我尝试从大纲视图中拖动一个项目时,什么也没有发生。相反,它只是更改光标后的选择。

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

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

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

4

2 回答 2

3

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

于 2011-03-24T22:25:43.937 回答
2

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

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

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

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

有关更多信息,请参阅命中测试

于 2011-03-24T22:04:46.527 回答