2010-12-02 76 views
3

我想從NSTableView行拖動文件以將其複製到另一個應用程序(即Finder)。我實現了本指南的前兩個步驟('配置您的表視圖','開始拖動操作'),並認爲這將做伎倆: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TableView/Tasks/UsingDragAndDrop.html將文件從NSTableView拖到其他osx應用程序

但是,當我試圖拖動一行時,行文字跟隨我的鼠標,但文件在發佈時不會複製。下面就是我在初始化時發送給我的UITableView:

#define librarySongDataType @"NSFileContentsPboardType" 
- (void)awakeFromNib 
{ 
    [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; // allow interapplication drags 
    [self registerForDraggedTypes:[NSArray arrayWithObject:librarySongDataType] ]; // NSFileContentsPboardType 
} 

這裏是我如何處理我的NSTableView的數據源(一個NSArrayController)的阻力:

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard 
{ 
    NSLog(@"writeRowsWithIndexes"); 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes]; 
    [pboard setData:data forType:librarySongDataType]; 
    return YES; 
} 

要清楚,我米不試圖拖動文件到我的表格視圖,我只是試圖拖出文件。

+1

我想你的意思是`NSTableView`。 `UITableView`只在iPhone上。 – d11wtq 2010-12-02 10:09:09

+0

啊,對不起,是的。我的意思是NSTableView。感謝您的更正。編輯。 – tassock 2010-12-02 18:31:22

回答

9

首先,您在寫這行時是指哪個文件?

[self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; 

這沒有意義。請勿使用NSUIntegerMax。使用定義爲here的操作掩碼。它寫在那裏,NSUIntegerMax代表一切,但你不應該使用它;蘋果可能會在未來重新定義這一點。你應該使用NSDragOperationCopy或特定的東西。如果您從網頁或圖書複製該行,則應停止信任該圖書/網頁。

其次,forLocal:應該是NO將數據傳遞給另一個應用程序;這裏的local表示應用程序本地。而不是考慮做一個NSFileWrapper和使用writeFileWrapper:設置它只是設置在

[pboard setData:data forType:librarySongDataType]; 

歸檔數據

三,看here。這樣你可以指定要在Finder中創建的文件名。否則,系統不知道數據代表什麼。

相關問題