我想从NSTableView行拖动文件,将其复制到另一个应用程序(即Finder)。我实现了本指南的前两个步骤('配置表视图','开始拖动操作'),并认为这样做可以解决问题: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TableView/Tasks/UsingDragAndDrop.html
但是,当我尝试拖动一行时,行文本跟在鼠标后面,但文件在释放时不会复制。这是我在初始化时发送到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;
}
要清楚,我不是要将文件拖到我的表视图中,我只是想把文件拖出来。
答案 0 :(得分:10)
首先,您在撰写此行时参考了哪个文档?
[self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES];
这没有意义。不要使用NSUIntegerMax
。使用定义here的操作掩码。它写在那里NSUIntegerMax
代表一切,但你不应该使用它; Apple可能会在未来重新定义该位。您应该使用NSDragOperationCopy
或特定的内容。如果您从网页或图书中复制该行,则应停止信任该图书/网页。
其次,forLocal:
应该NO
将数据传递给另一个应用程序; local
这里表示应用本地。
第三,而不是仅仅在
中设置存档数据 [pboard setData:data forType:librarySongDataType];
考虑制作NSFileWrapper
并使用writeFileWrapper:
进行设置,请参阅here。这样,您可以指定要在Finder中创建的文件名。否则,系统不知道数据代表什么。