为什么NSPasteboard的-types不返回包含NSPasteboardItem的-types的并集?

cam*_*dez 4 cocoa objective-c

对于文件NSPasteboard-types内容如下:

回报价值

一组NSString对象,包含为接收器上的所有粘贴板项声明的数据类型的并集.返回的类型按声明的顺序列出.

尽管如此,我NSPasteboard只有一个NSPasteboardItem[pboard types]返回更多类型而不是[item types]返回.有谁能解释一下?

这里有一些证明问题的代码:

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];

    // Prove that there's only one item
    if ([[pboard pasteboardItems] count] > 1)
        return NO;

    for (NSString* type in [pboard types])
        NSLog(@"Pasteboard type: %@", type);

    NSPasteboardItem* item = [[pboard pasteboardItems] objectAtIndex:0];

    for (NSString* type in [item types])
        NSLog(@"Item type: %@", type);

    return NO; // Ignore for example
}
Run Code Online (Sandbox Code Playgroud)

产量

当我从Safari拖动链接时,我得到以下输出:

Pasteboard type: dyn.ah62d4rv4gu8zs3pcnzme2641rf4guzdmsv0gn64uqm10c6xenv61a3k
Pasteboard type: WebURLsWithTitlesPboardType
Pasteboard type: dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu
Pasteboard type: Apple URL pasteboard type
Pasteboard type: public.url
Pasteboard type: CorePasteboardFlavorType 0x75726C20
Pasteboard type: public.url-name
Pasteboard type: CorePasteboardFlavorType 0x75726C6E
Pasteboard type: public.utf8-plain-text
Pasteboard type: NSStringPboardType
Item type: dyn.ah62d4rv4gu8zs3pcnzme2641rf4guzdmsv0gn64uqm10c6xenv61a3k
Item type: dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu
Item type: public.url
Item type: public.url-name
Item type: public.utf8-plain-text
Run Code Online (Sandbox Code Playgroud)

狂野的猜测

看起来[item types]基本上显示的是相同的类型[pboard types],但只有UTI版本.而且由于[pboard types]似乎是将UTI类型与相应的其他类型(?)类型交错,它基本上是一个映射......

我可以通过简单地将UTI用于我想要的数据格式来忽略这个问题,但我正在寻找WebURLsWithTitlesPboardType(对应于dyn.ah62d4rv4gu8zs3pcnzme2641rf4guzdmsv0gn64uqm10c6xenv61a3k),并且我对那些dyn.(...)UTI 持谨慎态度.听起来像不应该被硬编码的东西.

是否有可靠的方式将WebURLsWithTitlesPboardType样式标识符转换为UTI?我不相信实际使用的方法[pboard types]作为映射......

cam*_*dez 5

我确信,NSPasteboards的文档-types实际上是错误的.正确的文档应该是这样的:

一组NSString对象,包含为接收器上的所有粘贴板项声明的数据类型的并集,并添加了旧式非UTI类型标识符.

如果你的目标OS X 10.6以上,你应该能够完全不顾NSPasteboard-types,只专注于每一个NSPasteboardItem-types,但这需要专门与尿路感染的工作.

要将非UTI类型标识符转换为UTI,您需要使用该UTTypeCreatePreferredIdentifierForTag()函数; 你还需要知道你已经拥有什么样的标识符(kUTTagClassFilenameExtension,kUTTagClassMIMEType,kUTTagClassNSPboardTypekUTTagClassOSType).此类型是函数的第一个参数.第二个是标识符本身(作为a CFStringRef).虽然文档表明可以传递NULL第三个参数,但kUTTypeData在生成这些动态UTI时实际传递似乎很重要.

例如,要获取具有旧样式标识符"WebURLsWithTitlesPboardType"的数据的(动态)UTI:

CFStringRef webURLsWithTitlesUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, CFSTR("WebURLsWithTitlesPboardType"), kUTTypeData);
Run Code Online (Sandbox Code Playgroud)