对于文件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]作为映射......
我确信,NSPasteboards的文档-types实际上是错误的.正确的文档应该是这样的:
一组
NSString对象,包含为接收器上的所有粘贴板项声明的数据类型的并集,并添加了旧式非UTI类型标识符.
如果你的目标OS X 10.6以上,你应该能够完全不顾NSPasteboard的-types,只专注于每一个NSPasteboardItem的-types,但这需要专门与尿路感染的工作.
要将非UTI类型标识符转换为UTI,您需要使用该UTTypeCreatePreferredIdentifierForTag()函数; 你还需要知道你已经拥有什么样的标识符(kUTTagClassFilenameExtension,kUTTagClassMIMEType,kUTTagClassNSPboardType或kUTTagClassOSType).此类型是函数的第一个参数.第二个是标识符本身(作为a CFStringRef).虽然文档表明可以传递NULL第三个参数,但kUTTypeData在生成这些动态UTI时实际传递似乎很重要.
例如,要获取具有旧样式标识符"WebURLsWithTitlesPboardType"的数据的(动态)UTI:
CFStringRef webURLsWithTitlesUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, CFSTR("WebURLsWithTitlesPboardType"), kUTTypeData);
Run Code Online (Sandbox Code Playgroud)