关于可可粉:不过滤NSPasteboard

关于可可粉:不过滤NSPasteboard

Unfiltering NSPasteboard

是否有一种方法可以针对源应用程序明确声明它将提供的内容而对NSPasteboard进行过滤?

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

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

如果可能的话,我只想保存原始应用程序提供的内容。

John,您比我本人或与我一起工作的绅士要谨慎得多,自从恐龙在地球上漫游以来,他一直在从事Mac编程。我们俩都没有注意到您突出显示的文字...而且我也不知道为什么。显然,从这个问题开始太久了。

虽然我接受了您的答案作为正确答案,但并不能完全回答我原来的问题。我正在寻找的是一种仅通过将其放在粘贴板上即可识别可以变成其他口味的调味品的方法,并知道提供者最初提供的是哪种类型。在遍历类型列表时,将为我提供提供它们的应用程序的优先顺序,但它不会告诉我可以安全忽略的那些,因为稍后我重新填充粘贴板时将重新创建它们。

我得出的结论是,没有一种"好的"方法可以做到这一点。 [NSPasteboard declaredTypesFromOwner]很棒,但是不存在。


-[NSPasteboard types]将返回剪贴板上数据的所有可用类型,但应按照声明的顺序将它们" "返回。"

-[NSPasteboard declareTypes:owner:]的文档说:"类型应根据源应用程序的首选项进行排序。"

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

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

您可能可以从+[NSPasteboard typesFilterableTo:]中获得一些使用。我正在绘制如下片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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];
}

但是我不确定这在挑选好的类型方面有多有效。


推荐阅读