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

tas*_*ock 3 macos cocoa drag-and-drop objective-c

我想从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
}
Run Code Online (Sandbox Code Playgroud)

这是我在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;
}
Run Code Online (Sandbox Code Playgroud)

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

Yuj*_*uji 10

首先,你在撰写这一行时提到了哪个文件?

 [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; 
Run Code Online (Sandbox Code Playgroud)

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

其次,forLocal:应该将NO数据传递给另一个应用程序; local这意味着应用本地.

第三,而不是仅仅设置存档数据

 [pboard setData:data forType:librarySongDataType];
Run Code Online (Sandbox Code Playgroud)

考虑制作NSFileWrapper并使用它writeFileWrapper:,请参见此处.这样,您可以指定要在Finder中创建的文件名.否则,系统不知道数据代表什么.