NSOutlineView将多个项目拖放到单个xml文件Finder

时间:2019-07-10 14:59:26

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

我有一个NSOutlineView,具有拖放支持,可以对行进行重新排序。现在,我想将所选行的导出添加到Finder中的opml文件中。我设法在NSFilePromiseProvider期间设置了outlineView:pasteboardWriterForItem:,每一行都需要调用它。

我当前的测试环境包括所有相关的拖放委托方法的伪方法: NSDraggingSourceNSFilePromiseProviderDelegateNSPasteboardItemDataProviderNSPasteboardTypeOwnerNSPasteboardWriting,以及NSOutlineViewDataSource的源和目标委托方法。
使用最小的方法主体并在每次调用时打印输出。
而且大多数时候,委托方法只针对特定的NSPasteboardType,例如NSPasteboardTypeString

如何为所有选定的行一次创建一个承诺文件?最后,我想从大纲视图中将3行拖到桌面上,其中创建了1个文件“ export.opml”。

1 个答案:

答案 0 :(得分:0)

最后找到了可行的作品。事实证明outlineView:pasteboardWriterForItem:不是实例化NSFilePromiseProvider的正确位置。这是对我有用的东西:

ThisClass <NSFilePromiseProviderDelegate>
...

- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard {
    NSFilePromiseProvider *prov = [[NSFilePromiseProvider alloc] initWithFileType:@"public.xml" delegate:self];
    [pasteboard writeObjects:@[prov]];
    return YES;
}

- (nonnull NSString *)filePromiseProvider:(nonnull NSFilePromiseProvider *)filePromiseProvider fileNameForType:(nonnull NSString *)fileType {
    return @"myfile.opml";
}

- (void)filePromiseProvider:(nonnull NSFilePromiseProvider *)filePromiseProvider writePromiseToURL:(nonnull NSURL *)url completionHandler:(nonnull void (^)(NSError * _Nullable))completionHandler {
    NSLog(@"%@ %@", url, filePromiseProvider.userInfo);
    // write to file ...
    completionHandler(nil);
}