未过滤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]; 
} 

但我不知道如何选择好类型,这将是多么有效。