NSTableViewの行をドラッグ&ドロップ

やり方を理解するのに結構手間取ったのがNSArrayControllerのビューになっているNSTableViewの行をドラッグ&ドロップで入れ替える実装方法。

詳細な説明は省きますが、概念さえわかれば中身は意外とシンプルです。
NSTableViewDataSourceとして以下の3つを実装すればOK。

func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool

ドラッグ&ドロップの実態は、コピー&ペーストに近いものがあります。
ここでやるべきことはNSPastboardにユーザーが移動しようとしている行のIndexSet(複数行ドラッグの可能性があるためIndexSetが渡ってきます)をセットするだけ。
(コピーに相当。)

func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation

.moveを返せばドラッグ可能になります。

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool

NSPasteboardから取り出した(ペーストに相当)IndexSetと、移動先として渡ってきた行番号を手がかりにNSArrayControllerが管理している配列を並び替えるだけです。

わかってしまえばシンプルで泥臭い実装をするだけですね。

0 件のコメント:

コメントを投稿

Touchdown 1.3公開!

Touchdown 1.3を公開しました。 ダウンロードは こちら から。 Ver.1.3の変更点は以下の通りです。 新機能 macOS Mojave 10.13以降に対応 ダークモードに対応 ぜひお試しください。