NSPasteboard のフィルタリングを解除する
-
09-06-2019 - |
質問
ソース アプリケーションが提供すると具体的に宣言したものについて、NSPasteboard のフィルターを解除する方法はありますか?
アプリケーションでペーストボード データをシリアル化しようとしています。別のアプリケーションが RTF ファイルをペーストボードに配置し、使用可能なタイプを尋ねると、元の RTF からプレーンな文字列、dyn.* 値に至るまで、11 種類の異なる種類の RTF が得られます。
すべてのデータを 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];
}
ただし、これが良いタイプを選択するのにどれほど効果的かはわかりません。