首页 > 解决方案 > NSOutlineView 将多个项目拖放到单个 xml 文件 Finder

问题描述

我有一个NSOutlineView拖放支持来重新排序行。现在我想将所选行的导出添加到 Finder 中的 opml 文件中。我设法设置NSFilePromiseProviderduring outlineView:pasteboardWriterForItem:,每行都调用它。

我当前的测试环境包括所有相关拖放委托方法的虚拟方法: NSDraggingSourceNSFilePromiseProviderDelegateNSPasteboardItemDataProviderNSPasteboardTypeOwnerNSPasteboardWriting以及NSOutlineViewDataSource.
使用最小的方法体并在调用它们时打印出来。
而且大多数时候委托方法只为特定的NSPasteboardTypelike调用NSPasteboardTypeString

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

标签: objective-ccocoadrag-and-dropnsoutlineview

解决方案


终于找到了一个有效的组合。原来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);
}

推荐阅读