NSTableViewにファイルをドラッグアンドドロップしますか?
-
03-07-2019 - |
質問
NSTableView
を使用して、ユーザーがビデオファイルをドラッグアンドドロップできるようにします。ファイルをドロップすると、テーブルビューに行として追加されます。
これを行うにはどうすればよいですか?現在、tableviewはデータをArray Controllerから取得します(Array ControllerはNSMutableArrayからデータを取得します)
が見つかりましたこれはドキュメントですが、動作させるようには見えません。
持っている..
- <!> quot; TableCon <!> quot;クラス(NSObjectではなくNSTableViewから継承するように変更)
- NSTableViewクラスをTableConに変更しました
- NSTableViewのデリゲートアウトレットをそのクラスに設定します
- TableConのinitで
registerForDraggedTypes
と呼ばれる - 実装済み
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
(TableConでも同様)
..しかし、何も変更しなかった(エラーなし)ように動作します。何が間違っていますか?
編集: Boaz Stullerの提案を実装しようとしましたが、このソリューションの説明(最初の返信には、最初の投稿に対する解決策が含まれています)。だから今私がやったことは..
- テーブルビュー(TableListCon)にコンテンツを供給するサブクラスNSArrayController
- TableListConに
tableView
アウトレットを追加します(NSTableViewにポイントしました) - TableListConでvalidateDrop、writeRowsWithIndexes、acceptDropを実装します
- tableViewアウトレットでregisterForDraggedTypesを呼び出しました。
エラーも警告もありませんが、awakeFromNibメソッドのみが呼び出されているようです(他のメソッドは呼び出されていません)
解決
NSTableViewは、一般的なビューとは異なる方法でドラッグアンドドロップを処理します。これは全体的に良いことです。つまり、テーブルに必要な複雑な強調表示、セルトラッキング、挿入動作を手動で処理する必要はありません。
必要なものの説明は、こちら。基本的に、-registerDraggedTypes:(通常は-awakeFromNibメソッドで)を呼び出しますが、NSDraggingDestinationメソッドを実装する代わりに、ドラッグアンドドロップに関連するさまざまなデータソースメソッドを実装します。これはこちら。この方法でドラッグアンドドロップを実装するためにNSTableViewをサブクラス化する必要はありません。
これらはデータソースメソッドです。これらのメソッドを呼び出すには、テーブルビューのdataSourceアウトレットをそれらのメソッドを実装するクラスにフックする必要があります。
他のヒント
Boazの発言に加えて、NSTableViewサブクラスを作成し、そのサブクラスのインスタンスをNSTableViewのデリゲートにしているようです。サブクラスを作成する場合は、NSTableViewに加えてではなく、NSTableViewの代わりにそのサブクラスを使用する必要があります。また、ほとんどの場合、ビューを別のオブジェクトのデリゲートにすることは懸念事項に違反します。