5

有没有办法为源应用程序特别声明它将提供的内容取消过滤 NSPasteboard?

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

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

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


约翰,你比我自己或与我一起工作的那位自恐龙在地球上漫游以来一直在做 Mac 编程的绅士要敏锐得多。我们都没有注意到你突出显示的文字......我不知道为什么。显然,在这个问题上开始时间太长了。

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

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

4

2 回答 2

4

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

的文档-[NSPasteboard declareTypes:owner:]“应根据源应用程序的偏好对类型进行排序”。

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

[pb dataForType:[[pb types] objectAtIndex:0]]
于 2008-09-11T22:06:49.657 回答
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];
}

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

于 2008-09-12T18:32:25.840 回答