将文件从NSTableView拖到其他osx应用程序

时间:2010-12-02 09:15:46

标签: objective-c cocoa macos drag-and-drop

我想从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;
}

要清楚,我不是要将文件拖到我的表视图中,我只是想把文件拖出来。

1 个答案:

答案 0 :(得分:10)

首先,您在撰写此行时参考了哪个文档?

 [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; 

这没有意义。不要使用NSUIntegerMax。使用定义here的操作掩码。它写在那里NSUIntegerMax代表一切,但你不应该使用它; Apple可能会在未来重新定义该位。您应该使用NSDragOperationCopy或特定的内容。如果您从网页或图书中复制该行,则应停止信任该图书/网页。

其次,forLocal:应该NO将数据传递给另一个应用程序; local这里表示应用本地。

第三,而不是仅仅在

中设置存档数据
 [pboard setData:data forType:librarySongDataType];

考虑制作NSFileWrapper并使用writeFileWrapper:进行设置,请参阅here。这样,您可以指定要在Finder中创建的文件名。否则,系统不知道数据代表什么。