2012-10-12 66 views
3

我在用基於視圖的表格視圖編寫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擁有的窗口時,我將視圖拖動到高光,表明它將接受拖動。

但是,當我刪除圖像時,沒有創建文件。

爲什麼不是我已承諾的內容創建的文件?

回答

2

The documentation from the NSDraggingInfo protocol's namesOfPromisedFilesDroppedAtDestination: method給出一個提示:

源可以或可以不通過時間此方法返回創建的文件。

顯然,至少在表視圖上下文中,這意味着「自己創建文件,你懶惰的屁股」。

我修改了我的表格視圖數據源的tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:方法,告訴每個拖動的模型對象將自己寫入文件(由目標目錄URL +模型對象源URL的文件名組成),並在模型中實現該功能對象類。現在所有的作品。

相關問題