使用UTI将文件的内容放入NSPasteboard而非NSFileContentsPboardType?

问题描述:

我有几个图像和文本的富文本文件。在我的Cocoa应用程序中,我试图将该文件的内容放在NSDragPboard上,以便用户可以将的内容拖入其他应用程序(TextEdit,Mail等)。使用UTI将文件的内容放入NSPasteboard而非NSFileContentsPboardType?

一个用例是这样的:富文本文件包含一个电子邮件模板,用户将内容拖入一个新的邮件消息。

我想这没有成功:

NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; 
[pboard writeFileContents:filePath]; 

苹果的文档说这个:

写入文件 filename的内容到接收器,并宣布 数据为类型 NSFileContentsPboardType以及 类型适合文件的 扩展名(as如果它有一个,则由 由NSCreateFileContentsPboardType 函数在传递文件 扩展时返回)。

在ClipboardViewer应用程序中,我可以看到几种数据类型,一种是NXFileContentsPboardType。但是,Mail和TextEdit等应用不允许删除该数据类型。

当我复制的手(控制+ C),我看到所有我想要的不同的数据类型的富文本内容复制到剪贴板:

  • public.rtf
  • public.utf8-plain-text
  • NSStringPboardType
  • ...

那么我该如何以编程方式自己做这件事?我是否必须找出所有各种UTI类型并设置相应的数据?我认为这就是[pboard writeFileContents:path]是...

谢谢,马克。

编辑:

取得进展......这适用于.rtf文件,但不适用于.txt文件:

NSString *uti = // helper code to get UTI from NSURL resource key... 
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; 
[pboard declareTypes:[NSArray arrayWithObject:uti] owner:nil]; 
[pboard setData:[NSData dataWithContentsOfFile:filePath] forType:uti]; 

对于.txt文件放在剪贴板中的数据类型为public.text。但是,TextEdit和Mail.app不允许删除该类型。 public.rtf在富文本的情况下工作正常...

看起来像是无法将文件内容添加到粘贴板并自动检测内容类型。

事实证明,把RTF/RTFD文件的内容粘贴板上很简单,只要:

NSAttributedString *contents = [[NSAttributedString alloc] initWithPath:filePath documentAttributes:NULL]; 
// This sets the correct type automatically: 
[pboard writeObjects:[NSArray arrayWithObject:contents]]; 
[contents release];