问题描述
|
一旦您了解了UTI,10.6中的新粘贴板api似乎可以很好地工作,但是我遇到了一种我无法破解的情况:如果您要同时声明多个数据类型和一个文件,该怎么办?拖动?
看到新粘贴板的工作方式,可以使用setString,setData,setPropertyList或writeObjects在其上放置数据。前三个要求您预先指定UTI,以便接收方可以选择所需的表示形式。
最后一个-writeObjects-需要一组NSPasteboardWriting兼容对象,例如便利类NSPasteboardItem。
问题在于Finder会将添加到粘贴板的所有URL解释为原义URL,因此,与其拖动文件,不如将其创建为该文件的URL。
没有办法(我可以找到)为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应该添加一个文件。
解决方法
writeObjects:不是唯一的方法。您还可以使用:
setData:forType:
setPropertyList:forType:
setString:forType:
对于
NSURL
,您还可以使用NSURL Additions(+URLFromPasteboard:
和-writeToPasteboard:
)。