【问题标题】:NSPasteboard unable to read text when RTF data is copied to the pasteboard将 RTF 数据复制到粘贴板时,NSPasteboard 无法读取文本
【发布时间】:2014-07-13 13:49:23
【问题描述】:

我正在使用 NSPasteboard 从中读取数据并使用接收到的数据执行操作。

具体来说,我对以下按优先顺序列出的类型的信息感兴趣。

  1. 文件路径
  2. 文本数据
  3. 图像数据(这不是复制图像文件,而是图像的实际部分,例如,当您在编辑器中打开图像时,进行选择并按 command+v)

这就是我的代码

_pasteBoard = [NSPasteboard generalPasteboard];
NSArray *types = [_pasteBoard types];

NSArray *files = [_pasteBoard propertyListForType: NSFilenamesPboardType];

NSString *text = [_pasteBoard propertyListForType: NSStringPboardType];

NSString *text2 = [_pasteBoard propertyListForType: NSPasteboardTypeString];

NSString *rtfText = [_pasteBoard propertyListForType: NSRTFPboardType];

NSData *imageData = [_pasteBoard dataForType: NSTIFFPboardType];

现在,我只是在测试我是否能够获得所需的数据。因此,当我在 Destkop 上选择一些文件时,文件包含所选文件的 URL。这样就行了。

类似地,当我选择图像的某些部分并将其复制到剪贴板时,imageData 包含一些数据,然后我将其写入另一个文件,并且可以看到只有选定的药水被复制了,所以也可以。另外,我知道当我将图像“文件”复制到剪贴板时,imageData 也不会为零,但这没关系,因为最重要的是文件 URL,这就是需要做的事情。

我遇到的问题是与从粘贴板读取文本相关的行。

NSString *text = [_pasteBoard propertyListForType: NSStringPboardType];

NSString *text2 = [_pasteBoard propertyListForType: NSPasteboardTypeString];

NSString *rtfText = [_pasteBoard propertyListForType: NSRTFPboardType];

问题描述:

  1. 我复制了此页面的 URL,“text”和“text2”都包含粘贴板中的字符串。所以这里很好:)

  2. 我从 TextEdit 中打开的 .cs 代码文件中复制了一些行,剪贴板显示我有“public.utf8-plain-text”和“NSStringPboardType”,但“text”和“text2”都是 nil ;

  3. 从同一个 C#.NET .cs 文件中,我选择了一个单词,例如没有任何中断。 “System.Threading”,剪贴板显示我有“public.utf8-plain-text”和“NSStringPboardType”,“text”和“text2”都有复制的文本,但任何用空格或行复制的东西都不会。 “myProject.Core.Helpers”可以工作,但“命名空间 myProject.Core.Helpers”不行。

  4. 同样,我从 RTF 文件中复制了一些文本,剪贴板显示我有很多与 RTF 相关的信息以及相同的旧“public.utf8-plain-text”和“NSStringPboardType”类型,但是“text”、“text2”和这次“rtfText”都是零。

那么,如何从剪贴板中获取我在所有情况下都需要的文本?我知道 RTF 数据可以包含比文本更多的内容,但我只关心在字符串文件中获取文本。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您如何检查结果?你在登录吗?还是您正在调试会话中检查变量?
  • 我正在使用 Apples 免费提供的示例中的 [_pasteBoard types] 和剪贴板查看器。
  • 您是说剪贴板查看器对字符串和文本类型一无所获?我要问的是你如何确定你的texttext2 变量是nil?您是否使用NSLog() 记录它们?在调试器中检查它们?还有什么?
  • 我检查了调试器中的变量,然后有一些永远不会执行的 IF 语句(if(text))。
  • 当你在调试器中时,你确定你没有做任何会改变粘贴板所有者和内容的复制吗?您是否在不涉及调试器的情况下进行了测试?

标签: objective-c cocoa osx-mountain-lion osx-mavericks nspasteboard


【解决方案1】:

问题几乎可以肯定是您没有考虑粘贴板上的多个项目。在过去(OS X 10.5 及更早版本),粘贴板上只有一项。该项目可能有多种类型,它们应该是同一事物的表示。

现在,粘贴板可以有多个项目。每个项目仍然可以有多种类型。 -types 方法返回所有项目类型的联合。但是-propertyListForType: 只会检查第一项。

您可以遍历-pasteboardItems 返回的数组并询问每个数组的类型,然后获取每个类型的属性列表对象。

或者,对于您感兴趣的每种类型,您也可以使用相应类的单元素数组调用-readObjectsForClasses:options:。这不会(而且您通常不应该)区分不同的纯文本类型。所有这些都将匹配NSString

不过,最常见的方法是按照应用程序的偏好(通常是表达能力最强到最少),构建一个包含所有可以处理的类的数组,然后调用-readObjectsForClasses:options:。然后处理所有返回的对象。每个对象将以“最佳”可用形式用于粘贴板上的单个项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2014-08-31
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    相关资源
    最近更新 更多