在拖动到 Finder 时,如何实现NSOutlineViewDataSource
允许拖动文件系统中不存在的目录?我搜索并阅读了大量文档,但很难找到任何有价值的东西。我使用一个自定义数据源来管理类似文件系统的树,所有项目都是跟踪其路径的类的实例。我希望能够将文件和目录从大纲视图中拖到 Finder 中。
我有:
- (BOOL)outlineView:(NSOutlineView *)outlineView
writeItems:(NSArray *)items
toPasteboard:(NSPasteboard *)pasteboard
{
NSMutableArray *types = [NSMutableArray array];
for (JOItemInfo *itemInfo in items) {
NSString *extension = itemInfo.name.pathExtension;
if (extension.length > 0) [types addObject:extension];
}
[pasteboard declareTypes:@[(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise]
owner:self];
[pasteboard setPropertyList:types
forType:(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise];
DDLogInfo(@"Wrote types %@ to pasteboard %@ for key %@",
types,
pasteboard,
(__bridge_transfer NSString *)kPasteboardTypeFileURLPromise);
return YES;
}
并实现-outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems:
将项目写入给定路径内。这样做的原因是我可以将项目拖到 Finder 中,但是当我放手时,什么也没有发生,-...namesOfPromisedFilesDropped...
甚至没有调用该方法。还,
[self.outlineView setDraggingDestinationFeedbackStyle:NSTableViewDraggingDestinationFeedbackStyleRegular];
[self.outlineView setDraggingSourceOperationMask:NSDragOperationNone forLocal:YES];
[self.outlineView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
在我的-awakeFromNib
. 这if (extension.length > 0) ...
是基于我在某处找到的一个示例,但它已经过时了,并且文档说要返回一个扩展名,所以我认为这是合适的。就个人而言,我发现整个领域的文档非常缺乏,尤其是关于NSOutlineView
. 谢谢!