一旦您了解了 UTI,10.6 中的新粘贴板 api 似乎运行良好,但我遇到了一个我无法破解的情况:如果您声明多个数据类型与文件拖动一起怎么办?
查看新粘贴板的工作方式,您可以使用 setString、setData、setPropertyList 或 writeObjects 在其上放置数据。前 3 个要求您提前指定 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 应该会添加一个文件。