2

在拖动到 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. 谢谢!

4

1 回答 1

2

我更改(__bridge_transfer NSString *)kPasteboardTypeFileURLPromiseNSFilesPromisePboardType,现在我可以拖动文件(至少带有扩展名)并且可以将它们成功拖放到 Finder 中。(我使用了前者 b/c 后者的文档建议这样做,但它们没有相同的效果。)

此外,我尝试删除条件并允许它为空扩展添加一个空字符串,这就像一个魅力。我现在可以将大纲视图拖出到 Finder 中。

于 2013-09-01T02:10:46.547 回答