Cocoa 非过滤板

Cocoa 非过滤板,cocoa,filtering,pasteboard,Cocoa,Filtering,Pasteboard,是否有一种方法可以针对源应用程序明确声明的NSPasteboard提供的内容取消筛选 我正在尝试序列化应用程序中的粘贴板数据。当另一个应用程序将RTF文件放在粘贴板上,然后我询问可用的类型时,我得到了所述RTF的11种不同风格,从原始RTF到普通字符串再到dyn.*值 将所有这些数据保存到plist或磁盘上的原始数据中通常不是问题,因为它非常小,但当将任何相当大的图像放置在粘贴板上时,结果输出可能比源数据大几十倍(通过过滤可以获得多种TIFF和PICT数据) 如果可能的话,我希望能够保存原始应用

是否有一种方法可以针对源应用程序明确声明的NSPasteboard提供的内容取消筛选

我正在尝试序列化应用程序中的粘贴板数据。当另一个应用程序将RTF文件放在粘贴板上,然后我询问可用的类型时,我得到了所述RTF的11种不同风格,从原始RTF到普通字符串再到dyn.*值

将所有这些数据保存到plist或磁盘上的原始数据中通常不是问题,因为它非常小,但当将任何相当大的图像放置在粘贴板上时,结果输出可能比源数据大几十倍(通过过滤可以获得多种TIFF和PICT数据)

如果可能的话,我希望能够保存原始应用程序提供的内容


约翰,你比我或我的同事更善于观察,自从恐龙在地球上漫游以来,他一直在做Mac编程。我们都没有注意到你突出显示的文字。。。我不知道为什么。显然,从这个问题开始的时间太长了

虽然我承认你的答案是正确的,但它并没有完全回答我原来的问题。我所寻找的是一种方法,只需将它们放在粘贴板上,就可以识别出可以变成其他口味的口味,,并知道供应商最初提供的是哪种口味。当浏览类型列表时,会得到提供它们的应用程序的首选顺序,但它不会告诉我哪些可以安全地忽略,因为它们将在稍后重新填充粘贴板时重新创建


我得出的结论是,没有一个“好”的方法可以做到这一点
[NSPasteboard declaredTypesFromOwner]
非常棒,但它并不存在。

-[NSPasteboard types]
将返回剪贴板上数据的所有可用类型,但应该返回它们

-[NSPasteboard declareTypes:owner:][/code>的文档中说

因此,正确实现的粘贴板所有者应该将内容(可能是原始内容)最丰富的表示形式声明为第一种类型;因此,合理的单一代表应为:

[pb dataForType:[[pb types] objectAtIndex:0]]

你也许能从中得到一些好处。我正在描绘这样一个片段:

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];
}
NSArray*allTypes=[pb-types];
NSAssert([allTypes count]>0,@“应至少有一种类型”);
//我们总是需要第一个声明的类型作为起点。
NSMutableSet*requiredTypes=[NSMutableSet setWithObject:[allTypes objectAtIndex:0]];
对于(整数索引=1;索引<[所有类型计数];索引++){
NSString*aType=[allTypes objectAtIndex:index];
NSSet*filtersFrom=[NSSet setWithArray:[NSPasteboard typesFilterableTo:aType]];
//如果无法使用我们已经使用的筛选器重新创建此类型,请将其添加到
//所需类型的集合。
如果(![requiredTypes intersectsSet:filtersFrom])
[requiredTypes添加对象:aType];
}
然而,我不确定这对于挑选好的类型有多有效