粘贴板上的多种类型,包括文件,rtfd和自定义类型(M​​ac OS X 10.6)

时间:2011-06-14 23:06:55

标签: cocoa drag-and-drop nspasteboard

10.6中的新粘贴板api似乎能够很好地解决UTI问题,但我遇到了一个我无法破解的情况:如果你将多种数据类型与文件一起声明怎么办?拖动?

查看新粘贴板的工作方式,使用setString,setData,setPropertyList或writeObjects将数据放在其上。前3个要求您提前指定UTI,以便接收方可以选择它想要的表示。

最后一个 - writeObjects - 需要一组符合NSPasteboardWriting的对象,例如便捷类NSPasteboardItem。

问题在于,Finder会将添加到粘贴板的任何网址解释为文字网址,因此,不是拖动文件,而是会为文件创建网址。

我无法(我能找到)为URL创建NSPasteboardItem。留下这个(从标题):

APPKIT_EXTERN NSString *NSFilenamesPboardType; //Deprecated
// Use -writeObjects: to write file URLs to the pasteboard

但是,如果您将URL与NSPasteboard项混合,则结果不起作用。

NSPasteboardItem *noteItem = [[[NSPasteboardItem alloc] init] autorelease];
[noteItem setString:theString forType:NSPasteboardTypeString];

//Here is the problem: you can only have one or the other, not both.
[pasteboard writeObjects:[NSArray arrayWithObjects:noteItem, nil]]; //A
[pasteboard writeObjects:[NSArray arrayWithObject:fileURL]]; //B
// A or B will work but not both
[pasteboard writeObjects:[NSArray arrayWithObjects:
fileURL, noteItem, nil]]; //Will not work

我认为这是一个很好的例子,如果有人可以写出能够同时完成这两者的东西。

以下是测试:

  • 拖动到TextEdit应该插入文本

  • 拖动到Finder应该添加一个文件。

1 个答案:

答案 0 :(得分:2)

writeObjects:不是唯一的方法。您也可以使用:

对于NSURL,您还可以使用NSURL Additions+URLFromPasteboard:-writeToPasteboard:)。