macos - 如何使用 NSFilePromiseProvider 写入粘贴板

标签 macos cocoa drag

我正在尝试使用新的 NSPasteboardWriting API 支持使用 NSTableViewNSCollectionView 进行多项目拖动。在我的真实应用程序中,我可以为 TableView 进行拖动,但不能为 Collection View 进行拖动(NSFilePromiseProviderDelegate 方法永远不会被调用)。当我尝试从头开始构建演示应用程序时,我能够使用 NSTableView 重现此内容。

我已经在 DragDelegate 的两个方法中设置了断点,但都没有被调用。不过,-tableView:pasteboardWriterForRow: 确实被调用了。当我拖动到应用程序外部时,我看到该行的图像附加到光标,但就 Finder 而言,粘贴板上没有文件。没有选项可以拖放到 Dock 或 Finder 窗口上。

CollectionController 的实例被设置为我的表格 View 的dataSource。它有一个列,其文本标签绑定(bind)到所表示的对象(因为它只是一个 NSString)。我在 Mojave 10.14.0 上运行 Xcode 10.0。以下是我的类(class):

集合 Controller

@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

拖动委托(delegate)

@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

最佳答案

设置默认的拖动操作

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

关于macos - 如何使用 NSFilePromiseProvider 写入粘贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998215/

相关文章:

textbox - 在 IE9 中,在禁用的文本框中突出显示文本不会释放鼠标按钮;解决方法?

javascript - 如何使用 d3.js 拖动和旋转正交 map (地球仪)

python - 溢出错误 : user id is too big

无法在 MacOS 上从 shm_open 写入 fd

cocoa - 为什么编译器看不到@synthesize和@dynamic?

macos - OS X 数据文件编辑器保存到 XML : Document based or not?

c# - ItemsControl 中 WPF 中的可拖动对象?

ios - 德尔福,FireMonkey : How to find unique hardware id in OSX and iOS

macos - AppleScript for Mavericks 中的语法错误

macos - isDirectory 参数是否为 +[NSURL fileURLWithPath :isDirectory:] need to be correct?