Как написать в монтажный картон с 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;