使用UTI而不是NSFileContentsPboardType将文件内容放在NSPasteboard上?
-
14-11-2019 - |
题
我有包含一些图像和文本的富文本文件。在我的 Cocoa 应用程序中,我试图将该文件的内容放在 NSDragPboard
以便用户可以拖动 内容 到其他应用程序(文本编辑、邮件等)。
一个用例是这样的:富文本文件包含电子邮件模板,用户将内容拖到新的邮件消息中。
我尝试了这个但没有成功:
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard writeFileContents:filePath];
苹果文档是这样说的:
将文件文件名的内容写给接收器,并将数据声明为类型 NSFileContentsPboardType 以及适用于文件扩展程序的类型(通过文件扩展程序时,由NSCreateFileContentsPboardType函数返回),如果有一个文件)。
在 ClipboardViewer 应用程序中,我可以看到几种数据类型,其中之一是 NXFileContentsPboardType
. 。但是,邮件和文本编辑等应用程序不允许删除该数据类型。
当我手动将富文本内容复制到剪贴板 (Control+C) 时,我看到了我想要的所有不同数据类型:
public.rtf
public.utf8-plain-text
NSStringPboardType
- ...
那么我怎样才能自己以编程方式做到这一点呢?我是否必须弄清楚所有各种尿路感染类型并设置相应的数据?我以为就是这样 [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];
不隶属于 StackOverflow