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

NSOutlineView drag-n-drop multiple items to single xml file Finder

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

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

我怎样才能一次为所有选定的行创建一个承诺的文件?最后,我想将例如 3 行从我的大纲视图拖到桌面,并创建 1 个文件 'export.opml'。

终于找到了有效的作文。原来 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);
}