NSTableViewおよびNSOutlineViewのドラッグアンドドロップ
-
19-08-2019 - |
質問
NSTableViewとNSOutlineViewがあり、どちらもバインディングによって提供されるコンテンツを持ち、ドラッグアンドドロップ機能が必要です。
-
表Aから行をアウトラインBの行にドラッグし、アウトラインBの行が表すデータ構造にコピーされます。
-
アウトラインBの行をアウトラインBの別の行にドラッグすると、最初の行で表されるデータが2番目の行で表されるデータにコピーされます。
Appleのドラッグアンドドロップドキュメントを読みましたそしてどこにも行きません。それは本当に私がする必要があることには当てはまらないようです。何が足りないのですか?
解決
データソースが必要です<!>#8212;わかりました。バインディングだけではこれを実現できません。
BSDライセンスの下にある未完成のAdium Xtras Creatorには、データソースとして設定して、Bindingsを使用したテーブルビューでドラッグアンドドロップを取得できるアレイコントローラー。
この要件は、NSOutlineViewおよびNSTreeControllerには適用されない場合があります。試したことはありません。
他のヒント
リンク先のページは、何をする必要があるかについてかなり明確です。テーブルAのデータソースで、registerForDraggedTypes:
およびtableView:writeRowsWithIndexes:toPasteboard:
を実装して、いくつかのプライベートTableAPasteboardType
データをペーストボードに配置します。
アウトラインBのデータソースで、同じ2つのメソッドを実装し、いくつかのプライベートOutlineBPasteboardType
データをペーストボードに配置します。
最後に、tableView:validateDrop:proposedRow:proposedDropOperation:
およびtableView:acceptDrop:row:dropOperation:
を実装して、ペーストボードで<=>または<=>のいずれかを確認し、必要に応じてバインドされたモデルに適切な変更を加えます。
ただ耕してやれば、それは非常に簡単です。
MacOS 10.7では、これを実装するためにいくつかの新しいプロトコルが追加されました。
表のドキュメントがない現時点ではいくつかの素晴らしい例を見つけることができます:
NSTableViwewの場合、プロトコル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つのサブユースケースにつながります。最初はドラッグ<!> ampです。同じビュー内、または2つのビュー間の同じ操作内にドロップします。さらに、移動、コピー、または削除操作を区別できます。良い例は、ドラッグ<!> ampでブレークポイントがどのように機能するかです。 Xcodeにドロップします。
tableViewには、ドラッグ<!> amp;をカスタマイズするいくつかの追加メソッドがあります。ドロップしますが、私が言及したのはそれを機能させるための重要な方法です。