我在用基於視圖的表格視圖編寫Mac應用程序。這是一張圖像列表,我希望用戶能夠拖動到Finder以將每張圖像保存到一個文件中。從我的基於視圖的NSTableView有前途的文件
數據源擁有一組自定義模型對象。模型對象都符合NSPasteboardWriting
協議如下:
- (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]; }
,我的對象擁有的網頁的URL,而不是本地文件的URL。它們是圖像下載的URL。
表視圖的數據源和 - 代表功能於一身的實現與文件的承諾的方法:
- (NSArray *)tableView:(NSTableView *)tableView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestinationURL forDraggedRowsWithIndexes:(NSIndexSet *)rows { return [[self.screenshots objectsAtIndexes:rows] valueForKeyPath:@"screenshotImageURL.lastPathComponent"]; }
記錄該表達式的值產生具有正確的文件名的擴展有效的文件名。
最後,在windowDidLoad
,我已經派人來開啓這整個混亂的消息:
//Enable copy drags to non-local destinations (i.e., other apps).
[self.tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
舞臺設置。以下是當窗簾上升時發生的情況:
當我拖動到Finder擁有的窗口時,我將視圖拖動到高光,表明它將接受拖動。
但是,當我刪除圖像時,沒有創建文件。
爲什麼不是我已承諾的內容創建的文件?