Unfiltering NSPasteboard
-
09-06-2019 - |
题
有没有办法unfilter一NSPasteboard为什么源应用具体的宣布它将提供?
我试图serialize纸板数据在我的应用程序。当另一个应用程序的地方RTF上的文件纸板然后我请求提供的类型,我得到了十一个不同的口味的说RTF,一切都从原来的RTF为普通的字符串dyn。* 值。
省掉所有数据并入一个plist或原始数据上的磁盘通常不是一个问题,因为这是很小的,但当一个图像的任何相当大的尺寸是放在剪贴板,得到的输出可以数倍的源数据(与多种口味的TIFF和PICT数据正在提供通过滤波)。
我想就能够节省了原来的应用程序提出,如果可能的。
约翰,你更敏锐于自己或绅士我的工作与谁一直在做Mac编程自从恐龙漫游地球。我们都不曾注意到的文本强调了...我不知道为什么.起太长时间的问题,显然。
虽然我接受你的回答正确的答案,它不会确切地回答我的问题。我一直在寻找一种方法来鉴别的味道,可以成为其他的味道简单地通过,将它们放在剪贴板 和 要知道哪些类型最初提供的供应商。同时步行的类型清单将得到我的优选顺序的应用程序提供他们,也不会告诉我那些我可以忽略,因为他们将可以重新创建的时候我再充纸板后。
我得出的结论是,没有一个"好"的方式做到这一点。 [NSPasteboard declaredTypesFromOwner]
将是美妙的,但这并不存在。
解决方案
-[NSPasteboard types]
将返回的所有可用的类型的剪贴板上的数据,但它应当返回他们 "以他们的声明。"
该文件 -[NSPasteboard declareTypes: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];
}
我不知道效果如何,这将是在挑选良好的类型,但是。