gpt4 book ai didi

objective-c - 当 RTF 数据复制到粘贴板时,NSPasteboard 无法读取文本

转载 作者:行者123 更新时间:2023-12-03 17:11:35 27 4
gpt4 key购买 nike

我正在使用 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 包含一些数据,然后我将其写入另一个文件,并且可以看到仅复制了选定的部分,所以这也可以。另外,我知道当我将图像"file"复制到剪贴板时,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”可以工作,但“namespace myProject.Core.Helpers”则不行。

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

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

任何帮助将不胜感激。

谢谢!

最佳答案

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

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

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

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

不过,最常见的方法是按照应用程序偏好的顺序(通常从最具表现力到最不具有表现力)构建您可以处理的所有类的数组,然后对 -readObjectsForClasses:options 进行一次调用: 。然后处理所有返回的对象。每个对象都将以“最佳”可用形式代表粘贴板上的单个项目。

关于objective-c - 当 RTF 数据复制到粘贴板时,NSPasteboard 无法读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23842148/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com