取消过滤NSPasteboard

时间:2020-03-05 18:50:54  来源:igfitidea点击:

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

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

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

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

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

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

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

解决方案

回答

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

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

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

[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];
}

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