MacOS 10.7 では、これを実装するためにいくつかの新しいプロトコルが追加されました。
現時点では、テーブルのドキュメントは不足していますが、いくつかの良い例を見つけることができます:
NSTableVieww の場合、プロトコル NSTableViewDataSource は次のメソッドを定義します。
(BOOL)tableView:writeRowsWithIndexes:toPasteboard:
tableView:validateDrop:proposedRow:proposedDropOperation:
tableView:acceptDrop:row:dropOperation:
NSOutlineView の場合、プロトコル NSOutlineViewDataSource は次のメソッドを定義します。
(BOOL)outlineView:writeItems:toPasteboard:
(NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
(BOOL)outlineView:acceptDrop:item:childIndex:
これらは、ビューの種類ごとに実装するための最小要件です。ユースケースは非常に似ています。
- toPasteboard: メソッドが YES を返した場合、ドラッグが開始されます。
- validateDrop: メソッドは、ビュー内のマーカーを更新することにより、許可されるターゲット ノードを制御します。
- ドロップが成功した場合、acceptDrop: メソッドに対して YES を返す
これにより、管理しなければならない 2 つのサブユースケースが発生します。1 つ目は、同じビュー内でのドラッグ アンド ドロップ、または 2 つのビュー間での同じ操作です。さらに、移動、コピー、または削除操作を区別できます。良い例は、ブレークポイントが Xcode のドラッグ & ドロップでどのように機能するかです。
tableView には、ドラッグ アンド ドロップをカスタマイズするための追加のメソッドがいくつかありますが、私が言及したものは、それを機能させるための主要なメソッドです。