NSPasteboard の使用方法は 2 つあります。
古い方法: データを自分でボードにピン留めする
最初に、ペーストボードに配置する型を宣言する必要があります。また、ペーストボードを「所有」するオブジェクトを指定します。これは、ペーストボードに何かを配置するオブジェクトであることを意味します。
次のステップは、ペーストボードにデータを配置することです。この手順はオプションです。
「任意?!」とあなたは尋ねます。はい: 宣言したタイプのペーストボードにデータを配置せず、その後ペーストボードがそのデータを (貼り付け/ドロップするために) 必要とする場合、ペーストボードはあなた (所有者) にそのデータを要求します。これはデータの約束と呼ばれ、データのコピー (大規模) または生成にコストがかかる場合に適しています。
ペーストボードに物を置く方法は 5 つあります (要求される以外に):
- 文字列として。プレーンテキストにのみ適しています。ペーストボードは、必要に応じてさまざまなエンコーディングへの変換を処理します。
- 物件一覧として。プロパティ リスト (もちろん、これはずっと適用されるため、画像の配列はカウントされません)、またはプロパティ リストとの間で変換できるものにのみ適しています。独自のオブジェクトを実装する場合、これには独自のオブジェクトを含めることができます。
- 生データとして。画像タイプ (PNG、JPEG など) や A/V タイプ (MPEG-4 など) などの既存のデータ タイプに適しています。
- パスで識別されるファイルの内容として。ドラッグ/コピーしているものがすでにファイルである場合にのみ有効です。
- ファイル ラッパーのコンテンツとして。ファイル ラッパーをまだ使用していない場合は、これを無視しても問題ありません。
新しい方法: オブジェクトをボードにピン留めし、それら自体をデータに変換させます
Snow Leopard で導入された新しい hotness は、オブジェクト自体をペーストボードに書き込めるようにすることです。これには、識別子を含め、ペーストボードに必要な自分自身に関するすべてを知っている必要があります。
オブジェクトをNSPasteboardWritingとNSPasteboardReadingの両方に準拠させる必要があります。
古い方法を知っているので、書き込みプロトコルは非常に見慣れたものになります。ペーストボードは、それ自体を表す型をオブジェクトに尋ね、次に各型のプロパティ リスト オブジェクトを要求します。(プロトコルは、タイプのデータをすぐに要求する代わりに、タイプを約束する方法も提供します。)
NSPasteboardWriting に準拠するオブジェクトをペーストボードにコピーするには、ペーストボードにclearContents
メッセージ (新しい方法では必須、古い方法ではオプション) を送信し、writeObjects:
コピーするオブジェクトの配列を渡します。
読み取りプロトコルは、ご想像のとおり、逆です。貼り付けるには、ペーストボードにreadObjectsForClasses:options:
メッセージを送信します。ペーストボードは、これらのクラスのそれぞれに認識できる型を尋ね、(オプションで)ペーストボードにあるものから 1 つまたは複数のクラスをインスタンス化しようとします。
これの欠点は、特に再利用識別子に関する場合、モデル レイヤーとコントローラー レイヤーの分離が壊れてしまう可能性があることです。読み取り初期化子は、その識別子を持つ既存のオブジェクトを返したい場合、その識別子をどうするかを知る必要があります。つまり、コントローラーと通信する (悪い) か、コントローラーのルックアップ コードを複製する (悪い) 必要があります。
この問題に遭遇せずに、新しいプロトコルで移動ドラッグ アンド ドロップ (並べ替えを含むが、これに限定されない) を実装する良い方法を私は知りません。コピーのドラッグ アンド ドロップ (クロス プロセスを含むがこれに限定されない) の場合、識別子は必要ないので問題ありません。一方の端でデータを生成し、もう一方の端でそのデータから新しいコピーを作成するだけです。 .
新しい方法の利点は、複数のアイテムの処理がはるかに適切であることです。古い方法では、「アイテム」は 1 つしかありません。実際、アイテムの概念はまったくありません。複数のタイプがあります。複数のものをコピーまたはドラッグしたい場合は、配列を作成し、それをあるタイプの単一のプロパティ リストとしてコピーしてから、もう一方の端でその単一のプロパティ リストから複数のものを再作成/取得しました。新しい方法では、1 つ以上のアイテムが明示的にサポートされます。複数のものをコピーするときは、それらすべてを に渡すだけですwriteObjects:
。
あなたのケース: 単一の NSUInteger 識別子
それを NSNumber (プロパティ リスト) に入れ、古い方法で使用します。