将RTF数据复制到粘贴板时,NSPasteboard无法读取文本

时间:2014-05-24 06:51:45

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

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

具体而言,我对按优先顺序排列的类型信息感兴趣。

  1. 文件路径
  2. 文字数据
  3. 图像数据(这不是复制图像文件,而是复制图像的实际部分,例如在编辑器中打开图像时,进行选择并按下命令+ v)
  4. 这就是我在代码中所拥有的

    _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包含一些数据,然后我将其写入另一个文件,并且可以看到只复制了所选的部分,因此也可以。另外,我理解当我复制图像时#34;文件"然后,对于剪贴板,imageData也不会是nil,但这没关系,因为最高优先级是文件URL,这就是需要做的事情。

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

    NSString *text = [_pasteBoard propertyListForType: NSStringPboardType];
    
    NSString *text2 = [_pasteBoard propertyListForType: NSPasteboardTypeString];
    
    NSString *rtfText = [_pasteBoard propertyListForType: NSRTFPboardType];
    

    问题描述:

    1. 我复制了此页面的网址以及" text"和" text2"包含来自粘贴板的字符串。所以这里很好:))

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

    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"都没有。

    5. 那么,如何从剪贴板中获取所有需要的文本?我知道RTF数据可以包含更多文本,但我只关心将文本输出到字符串文件中。

      非常感谢任何帮助。

      谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

但是,最常见的方法是按照应用程序的首选项(通常最具表现力)来构建一个可以处理的所有类的数组,并调用{{1} }。然后处理返回的所有对象。每个对象将用于"最佳"中的粘贴板上的单个项目。可用表格。