17

NSPasteboard を動作させるのに非常に苦労しているので、理解が不足していることをお許しください。

私が望むのは、アプリケーション専用の NSUInteger 値をペーストボードに書き込んで取得する簡単な方法だけです。私がしているのは、アプリケーション内でアイテムをドラッグ ドロップすることだけなので、ペーストボードで必要なのはアイテムの ID だけです。

私は NSPasteboardItemDataProvider と NSPasteboardItem、および NSData を調べてみましたが、それらはすべて非常に単純なことを行うための複雑な方法です。実際、私はとても単純なことを行う正しい方法が何かわかりません.周りのすべてのサンプルは文字列型、またはもっと複雑なものを扱っているようです. [NSMutable SetData] セレクターも存在しないようですが、コードに警告はありません。

誰かが私を正しい方向に向けることができれば、とても感謝しています. :)

編集: [dragImage ...] を使用して、ドラッグ操作を支援しています。

4

2 に答える 2

48

NSPasteboard の使用方法は 2 つあります。

古い方法: データを自分でボードにピン留めする

最初に、ペーストボードに配置する型を宣言する必要があります。また、ペーストボードを「所有」するオブジェクトを指定します。これは、ペーストボードに何かを配置するオブジェクトであることを意味します。

次のステップは、ペーストボードにデータを配置することです。この手順はオプションです。

「任意?!」とあなたは尋ねます。はい: 宣言したタイプのペーストボードにデータを配置せず、その後ペーストボードがそのデータを (貼り付け/ドロップするために) 必要とする場合、ペーストボードはあなた (所有者) にそのデータを要求します。これはデータの約束と呼ばれ、データのコピー (大規模) または生成にコストがかかる場合に適しています。

ペーストボードに物を置く方法は 5 つあります (要求される以外に):

  • 文字列として。プレーンテキストにのみ適しています。ペーストボードは、必要に応じてさまざまなエンコーディングへの変換を処理します。
  • 物件一覧として。プロパティ リスト (もちろん、これはずっと適用されるため、画像の配列はカウントされません)、またはプロパティ リストとの間で変換できるものにのみ適しています。独自のオブジェクトを実装する場合、これには独自のオブジェクトを含めることができます。
  • 生データとして。画像タイプ (PNG、JPEG など) や A/V タイプ (MPEG-4 など) などの既存のデータ タイプに適しています。
  • パスで識別されるファイルの内容として。ドラッグ/コピーしているものがすでにファイルである場合にのみ有効です。
  • ファイル ラッパーのコンテンツとして。ファイル ラッパーをまだ使用していない場合は、これを無視しても問題ありません。

新しい方法: オブジェクトをボードにピン留めし、それら自体をデータに変換させます

Snow Leopard で導入された新しい hotness は、オブジェクト自体をペーストボードに書き込めるようにすることです。これには、識別子を含め、ペーストボードに必要な自分自身に関するすべてを知っている必要があります。

オブジェクトをNSPasteboardWritingNSPasteboardReadingの両方に準拠させる必要があります。

古い方法を知っているので、書き込みプロトコルは非常に見慣れたものになります。ペーストボードは、それ自体を表す型をオブジェクトに尋ね、次に各型のプロパティ リスト オブジェクトを要求します。(プロトコルは、タイプのデータをすぐに要求する代わりに、タイプを約束する方法も提供します。)

NSPasteboardWriting に準拠するオブジェクトをペーストボードにコピーするには、ペーストボードにclearContentsメッセージ (新しい方法では必須、古い方法ではオプション) を送信し、writeObjects:コピーするオブジェクトの配列を渡します。

読み取りプロトコルは、ご想像のとおり、逆です。貼り付けるには、ペーストボードreadObjectsForClasses:options:メッセージを送信します。ペーストボードは、これらのクラスのそれぞれに認識できる型を尋ね、(オプションで)ペーストボードにあるものから 1 つまたは複数のクラスをインスタンス化しようとします。

これの欠点は、特に再利用識別子に関する場合、モデル レイヤーとコントローラー レイヤーの分離が壊れてしまう可能性があることです。読み取り初期化子は、その識別子を持つ既存のオブジェクトを返したい場合、その識別子をどうするかを知る必要があります。つまり、コントローラーと通信する (悪い) か、コントローラーのルックアップ コードを複製する (悪い) 必要があります。

この問題に遭遇せずに、新しいプロトコルで移動ドラッグ アンド ドロップ (並べ替えを含むが、これに限定されない) を実装する良い方法を私は知りません。コピーのドラッグ アンド ドロップ (クロス プロセスを含むがこれに限定されない) の場合、識別子は必要ないので問題ありません。一方の端でデータを生成し、もう一方の端でそのデータから新しいコピーを作成するだけです。 .

新しい方法の利点は、複数のアイテムの処理がはるかに適切であることです。古い方法では、「アイテム」は 1 つしかありません。実際、アイテムの概念はまったくありません。複数のタイプがあります。複数のものをコピーまたはドラッグしたい場合は、配列を作成し、それをあるタイプの単一のプロパティ リストとしてコピーしてから、もう一方の端でその単一のプロパティ リストから複数のものを再作成/取得しました。新しい方法では、1 つ以上のアイテムが明示的にサポートされます。複数のものをコピーするときは、それらすべてを に渡すだけですwriteObjects:

あなたのケース: 単一の NSUInteger 識別子

それを NSNumber (プロパティ リスト) に入れ、古い方法で使用します。

于 2011-08-30T18:13:52.700 に答える