如何使用NSFilePromiseProvider写入粘贴板

时间:2018-10-25 21:14:50

标签: macos cocoa drag nsfilepromiseprovider

我正在尝试使用新的NSTableView API通过NSCollectionViewNSPasteboardWriting支持多项目拖动。在我的真实应用程序中,我拖动了表视图的工作,但没有拖动集合视图的工作(NSFilePromiseProviderDelegate方法从未调用)。当我尝试从头开始构建演示应用程序时,我能够使用NSTableView来重现该应用程序。

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

CollectionController的一个实例被设置为我的表视图的dataSource。它只有一列,其文本标签绑定到表示的对象(因为它只是NSString)。我正在Mojave 10.14.0上运行Xcode 10.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 :(得分:2)

设置默认的拖动操作

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