【问题标题】:Drag file from NSTableView to other osx application将文件从 NSTableView 拖到其他 osx 应用程序
【发布时间】:2010-12-02 09:15:46
【问题描述】:

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

需要明确的是,我不是想将文件拖到我的表格视图中,我只是想将文件拖出它。

【问题讨论】:

  • 我想你的意思是NSTableViewUITableView 仅在 iPhone 上。
  • 啊,对不起,是的。我的意思是 NSTableView。感谢您的指正。已编辑。

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


【解决方案1】:

首先,你写这行时参考了哪个文件?

 [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; 

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

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

第三,不仅仅是在

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

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

【讨论】:

  • 非常感谢您的帮助!您对“forLocal”参数的更正为我修复了它。
  • 解决了为什么只有我的应用能识别粘贴板的问题,ta。
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多