我正在使用NSPasteboard读取数据,并对接收到的数据执行操作。
具体来说,我对以下按优先级列出的类型的信息感兴趣。
文件路径
文字数据
图像数据(这不是复制图像文件,而是图像的实际部分,例如,当您在编辑器中打开图像时,进行选择并按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];
问题描述:
我复制了此页面的URL,“ text”和“ text2”都包含粘贴板中的字符串。所以在这里很好:)
我从TextEdit中打开的.cs代码文件中复制了几行,剪贴板显示我有“ public.utf8-plain-text”和“ NSStringPboardType”,但“ text”和“ text2”都为零;
从同一个C#.NET .cs文件中,我选择一个单词,例如,没有任何中断。剪贴板“ System.Threading”显示我有“ public.utf8-plain-text”和“ NSStringPboardType”,“ text”和“ text2”都具有复制的文本,但是用空格或行复制的任何东西都不会。 “ myProject.Core.Helpers”将起作用,但“命名空间myProject.Core.Helpers”将不会起作用。
同样,我从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/