Как написать в монтажный картон с NSFilePromiseProvider - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь поддерживать перетаскивание нескольких элементов с помощью 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 Ответ

0 голосов
/ 26 октября 2018

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

 - (void)setDraggingSourceOperationMask:(NSDragOperation)mask forLocal:(BOOL)isLocal;
...