1

一旦您了解了 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 应该会添加一个文件。

4

1 回答 1

2

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

因为NSURL你也有机会使用NSURL Additions (+URLFromPasteboard:-writeToPasteboard:)。

于 2011-06-15T12:10:16.440 回答