我正在尝试使用新的NSTableView
API通过NSCollectionView
和NSPasteboardWriting
支持多项目拖动。在我的真实应用程序中,我拖动了表视图的工作,但没有拖动集合视图的工作(NSFilePromiseProviderDelegate
方法从未调用)。当我尝试从头开始构建演示应用程序时,我能够使用NSTableView
来重现该应用程序。
我在DragDelegate
的两个方法中都设置了断点,但都没有被调用。 -tableView:pasteboardWriterForRow:
确实会被调用。当我将应用程序拖到应用程序外部时,我看到该行的图像已附加到光标上,但是就Finder而言,粘贴板上没有文件。没有选项可以放到Dock或Finder窗口中。
CollectionController
的一个实例被设置为我的表视图的dataSource
。它只有一列,其文本标签绑定到表示的对象(因为它只是NSString
)。我正在Mojave 10.14.0上运行Xcode 10.0。这是我的课程:
@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
@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
答案 0 :(得分:2)
设置默认的拖动操作
- (void)setDraggingSourceOperationMask:(NSDragOperation)mask forLocal:(BOOL)isLocal;