NSOutlineView перетащить несколько элементов в один файл XML Finder - PullRequest
0 голосов
/ 10 июля 2019

У меня есть NSOutlineView с поддержкой перетаскивания для изменения порядка строк. Теперь я хотел бы добавить экспорт выбранных строк в файл opml в Finder. Мне удалось настроить NSFilePromiseProvider во время outlineView:pasteboardWriterForItem:, который вызывается для каждой строки.

Моя текущая среда тестирования включает в себя фиктивные методы всех связанных методов делегирования drag-n-drop: NSDraggingSource, NSFilePromiseProviderDelegate, NSPasteboardItemDataProvider, NSPasteboardTypeOwner, NSPasteboardWriting и методы делегата источника и назначения NSOutlineViewDataSource.
С минимальным телом метода и распечаткой при каждом вызове.
И в большинстве случаев методы делегатов вызываются только для определенных NSPasteboardType, таких как NSPasteboardTypeString.

Как я могу иметь один обещанный файл для всех выбранных строк одновременно? В конце я хочу перетащить, например, 3 строки из моего контурного вида на рабочий стол с созданным 1 файлом 'export.opml'.

1 Ответ

0 голосов
/ 10 июля 2019

Наконец-то нашел композицию, которая работает. Оказывается, 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);
}
...