5

ソースアプリケーションが提供すると具体的に宣言したものについて、NSPasteboard のフィルターを解除する方法はありますか?

アプリケーションでペーストボード データをシリアル化しようとしています。別のアプリケーションが RTF ファイルをペーストボードに配置し、使用可能なタイプを尋ねると、元の RTF からプレーンな文字列、dyn.* 値まで、11 種類の RTF が返されます。

そのすべてのデータを 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 に答える