Как написать в монтажный картон с NSFilePromiseProvider

Я пытаюсь поддерживать перетаскивание нескольких элементов с помощью NSTableView а также NSCollectionView используя новый NSPasteboardWriting API-интерфейсы. В моем реальном приложении перетаскивание работает для моего табличного представления, но не для моего представления коллекции (NSFilePromiseProviderDelegate методы никогда не вызываются). Когда я попытался создать демонстрационное приложение с нуля, я смог воспроизвести это с NSTableView,

Я установил контрольные точки внутри обоих методов DragDelegateи ни один не будет вызван. -tableView:pasteboardWriterForRow: все же звонят. Когда я перетаскиваю вне приложения, я вижу изображение строки, прикрепленное к курсору, но что касается Finder, на монтажном столе нет файлов. Там нет опции, чтобы зайти в Dock или окно Finder.

Экземпляр CollectionController устанавливается как мой вид таблицы dataSource, У него есть один столбец, текстовая метка которого связана с представленным объектом (так как это просто NSString). Я использую Xcode 10.0 на Mojave 10.14.0. Вот классы, которые у меня есть:

CollectionController

@interface CollectionController : NSObject <NSTableViewDataSource>

@property (strong) id<NSFilePromiseProviderDelegate> dragDelegate;

@end

@implementation CollectionController

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return 1;
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn
            row:(NSInteger)row
{
    return @"Test string";
}

- (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row {
    self.dragDelegate = [[DragDelegate alloc] init];
    return [[NSFilePromiseProvider alloc] initWithFileType:@"public.text"
                                                  delegate:self.dragDelegate];

    return prov;
}

@end

DragDelegate

@interface DragDelegate: NSObject <NSFilePromiseProviderDelegate>

@end

@implementation DragDelegate

- (NSString *)filePromiseProvider:(NSFilePromiseProvider *)filePromiseProvider
                  fileNameForType:(NSString *)fileType
{
    return @"file.txt";
}

- (void)filePromiseProvider:(NSFilePromiseProvider *)filePromiseProvider
          writePromiseToURL:(NSURL *)url
          completionHandler:(void (^)(NSError * _Nullable))completionHandler
{
    NSData *data = [@"test file contents" dataUsingEncoding:NSUTF8StringEncoding];
    [data writeToURL:url atomically:YES];
    completionHandler(nil);
}

@end

1 ответ

Решение

Установите операцию перетаскивания по умолчанию с

 - (void)setDraggingSourceOperationMask:(NSDragOperation)mask forLocal:(BOOL)isLocal;
Другие вопросы по тегам