gpt4 book ai didi

cocoa - 来 self 的基于 View 的 NSTableView 有希望的文件

转载 作者:行者123 更新时间:2023-12-03 16:19:39 24 4
gpt4 key购买 nike

我正在编写一个带有基于 View 的表格 View 的 Mac 应用程序。它是一个图像列表,我希望用户能够将其拖动到 Finder 以将每个图像保存到文件中。

数据源拥有一组自定义模型对象。模型对象均符合 NSPasteboardWriting 协议(protocol),如下所示:

- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard {    //self.screenshotImageDataType is set after the image is downloaded, by examining the data with a CGImageSource.    //I have verified that it is correct at this point. Its value in my test was @"public.jpeg" (kUTTypeJPEG).    return @[ self.screenshotImageDataType, (__bridge NSString *)kUTTypeURL, (__bridge NSString *)kPasteboardTypeFilePromiseContent ];}- (id)pasteboardPropertyListForType:(NSString *)type {    if (UTTypeEqual((__bridge CFStringRef)type, (__bridge CFStringRef)self.screenshotImageDataType)) {        return self.screenshotImageData;    } else if (UTTypeEqual((__bridge CFStringRef)type, kUTTypeURL)) {        return [self.screenshotImageURL pasteboardPropertyListForType:type];    } else if (UTTypeEqual((__bridge CFStringRef)type, kPasteboardTypeFilePromiseContent)) {        return self.screenshotImageDataType;    }    id plist = [self.screenshotImage pasteboardPropertyListForType:type]        ?: [self.screenshotImageURL pasteboardPropertyListForType:type];    NSLog(@"plist for type %@: %@ %p", type, [plist className], plist);    return [self.screenshotImage pasteboardPropertyListForType:type]        ?: [self.screenshotImageURL pasteboardPropertyListForType:type];}

The URLs that my objects own are web URLs, not local files. They're the URLs the images were downloaded from.

The table view's data-source-and-delegate-in-one implements a method relating to file promises:

- (NSArray *)tableView:(NSTableView *)tableViewnamesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestinationURLforDraggedRowsWithIndexes:(NSIndexSet *)rows{    return [[self.screenshots objectsAtIndexes:rows] valueForKeyPath:@"screenshotImageURL.lastPathComponent"];}

Logging the value of that expression produces a valid filename with the correct filename extension.

Finally, in windowDidLoad, I have sent the message that turns this whole mess on:

//Enable copy drags to non-local destinations (i.e., other apps).
[self.tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];

舞台已经搭好。当窗帘升起时会发生以下情况:

当我拖动到 Finder 拥有的窗口时,我拖动到的 View 会突出显示,表明它将接受拖动。

但是,当我放下图像时,不会创建任何文件。

为什么我所 promise 的内容的文件没有被创建?

最佳答案

The documentation from the NSDraggingInfo protocol's namesOfPromisedFilesDroppedAtDestination: method给出提示:

The source may or may not have created the files by the time this method returns.

显然,至少在 TableView 上下文中,这意味着“你这个懒惰的家伙,自己创建文件”。

我修改了 TableView 数据源的 tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes: 方法,告诉每个拖动的模型对象将自身写入文件(由目标目录 URL + 模型对象的文件名组成)源 URL),并在模型对象类中实现该功能。现在一切正常。

关于cocoa - 来 self 的基于 View 的 NSTableView 有希望的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com