未过滤NSPasteboard
有没有方法可以对NSPasteboard进行未经过特别声明的源应用程序的提供?未过滤NSPasteboard
我试图在我的应用程序中序列化粘贴板数据。当另一个应用程序将一个RTF文件放在一个粘贴板上,然后我询问可用的类型时,我得到了11种不同的RTF格式,从原始的RTF到纯文本字符串到dyn。*值。
将所有数据保存到磁盘上的plist或原始数据通常不是问题,因为它非常小,但是如果将任何相当大小的图像放在粘贴板上,则结果输出可能会达到几十倍大于源数据(通过过滤可获得多种TIFF和PICT数据)。
我想只能尽可能地保存原始应用程序的可用空间。
约翰,你比我自己或我与谁一直在做的Mac编程,因为恐龙漫游地球的工作绅士更为敏锐。我们都没有注意到你突出显示的文字......我不知道为什么。显然,问题开始时间过长。
虽然我接受你的答案作为正确答案,但它并不完全回答我原来的问题。我正在寻找的是一种识别可以成为其他口味的口味的方法,仅仅通过将它们放置在粘贴板和上来知道哪些类型最初由提供者提供。虽然漫步类型列表会让我获得提供它们的应用程序的首选顺序,但它不会告诉我哪些是我可以放心忽略的,因为稍后再填充粘贴板时它们将被重新创建。
我得出的结论是,没有一个“好”的方法来做到这一点。 [NSPasteboard declaredTypesFromOwner]
会很棒,但它不存在。
-[NSPasteboard types]
将返回所有可用的类型剪贴板上的数据,但它应该返回他们"in the order they were declared."
为-[NSPasteboard declareTypes:owner:]
文档说"the types should be ordered according to the preference of the source application."
一个正确实施纸板所有者应,因此,申报作为第一种类型的内容(可能是原始内容)的最丰富的表示;所以合理的单一的表示应该是:
[pb dataForType:[[pb types] objectAtIndex:0]]
您可以得到一些使用了+[NSPasteboard typesFilterableTo:]
。我想像这样一个片段:
NSArray *allTypes = [pb types];
NSAssert([allTypes count] > 0, @"expected at least one type");
// We always require the first declared type, as a starting point.
NSMutableSet *requiredTypes = [NSMutableSet setWithObject:[allTypes objectAtIndex:0]];
for (NSUInteger index = 1; index < [allTypes count]; index++) {
NSString *aType = [allTypes objectAtIndex:index];
NSSet *filtersFrom = [NSSet setWithArray:[NSPasteboard typesFilterableTo:aType]];
// If this type can't be re-created with a filter we already use, add it to the
// set of required types.
if (![requiredTypes intersectsSet:filtersFrom])
[requiredTypes addObject:aType];
}
但我不知道如何选择好类型,这将是多么有效。