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