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

问题描述

| 一旦您了解了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:
)。