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应该添加一个文件。
答案 0 :(得分:2)
writeObjects:不是唯一的方法。您也可以使用:
对于NSURL
,您还可以使用NSURL Additions(+URLFromPasteboard:
和-writeToPasteboard:
)。