nstableviewドラッグアンドドロップが機能しません
-
10-10-2019 - |
質問
私は自分のnstableviewのために非常に基本的なドラッグアンドドロップをセットアップしようとしています。テーブルビューには、単一の列があります(カスタムセル付き)。列はnsarrayControllerにバインドされており、アレイコントローラーのコンテンツアレイは、コントローラーオブジェクトのnsArrayにバインドされています。データはテーブルに正常に表示されます。私は接続しました dataSource
と delegate
テーブルのアウトレットは私のコントローラーオブジェクトを表示し、次にこれらのメソッドを実装しました。
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
NSLog(@"dragging");
return YES;
}
- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op
{
return NSDragOperationEvery;
}
- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
return YES;
}
また、ドラッグタイプを登録しました -awakeFromNib
:
#define MyDragType @"MyDragType"
- (void)awakeFromNib
{
[super awakeFromNib];
[_myTable registerForDraggedTypes:[NSArray arrayWithObjects:MyDragType, nil]];
}
問題は、-tableview:writerwswithindexes:topasteboard:method is is 決して呼ばれませんでした. 。私はたくさんの例を見てきましたが、私が間違っていることは何も理解できません。問題は、私がカスタムセルを使用していることです。この機能を有効にするために、セルサブクラスでオーバーライドすることになっているものはありますか?
編集:確認されました。通常のNSTextFieldCellのカスタムセルを切り替えて、ドラッグ作業を行いました。今、 カスタムセルでドラッグアンドドロップを機能させるにはどうすればよいですか?
解決 2
問題を修正しました。テーブルビューでカスタムNSCELLを使用してバインディングを使用することに問題があるようです。伝統に切り替えます NSTableViewDataSource
バインディングやアレイコントローラーではなく、それを解決しました。
他のヒント
私は同じ問題に対するよりエレガントな解決策を求めて壁に頭を叩いていました、そして、私はこれに出会いました:
http://www.wooji-juice.com/blog/cocoa-10-bindings.html
たとえば、テーブルからドラッグアンドドロップをサポートする場合は、データソースを設定する必要があります。実際のデータを提供するためにバインディングを使用している場合でも、データソースを設定できます。ココアは処理する必要があります
tableView:writeRowsWithIndexes:toPasteboard
および関連メッセージ。
うん。すべてがアレイコントローラーにバインドされている場合、アレイコントローラーに必要なドラッグ/ドロップ機能を実装してから、テーブルビューのデータソースをアレイコントローラーに設定させることができることができることです。 setDataSource:
.
私にとって有効なのは、カスタムセルの初期イザー(私の場合、init)内でinitまたはinitimagecellではなく、inittextcellに電話することです。スーパークラスがnscellまたはnsactioncellであるかどうかは関係ないようです。また、私は拘束力があり、ドラッグはまだ機能します。
ドラッグが開始されるのに十分なはずです。あなたは 承知しました デリゲートメソッドを接続していますか?
私はこの問題に遭遇しました、あなたのカスタムセルは拡張する必要があります NSActionCell
いいえ NSCell
ドラッグアンドドロップを適切に動作させたい場合。おそらくあなたが実装できるものがあります NSCell
それはすべてそれをすべて動作させるでしょうが、私はに切り替えた後、それ以上掘りませんでした NSActionCell
. 。少なくとも、それは私にとって問題を修正しました。
私は問題に遭遇しました。私はnscellサブクラスを持っています、そして私は実装しました tableView:writeRowsWithIndexes:toPasteboard
データソースはnstableviewに設定されました。ドラッグは機能しません。
カスタムサブクラスのinitにセルタイプを設定した場合
self.type = NSTextCellType;
それから私はドラッグします。そうしないと、デフォルトです NSNullCellType
ドラッグは機能しません。私はそれを別のサブクラスを使用して機能させた人々を推測しています NSTextFieldCell
細胞タイプが異なるため、機能します。
また、同様の問題、nstableviewのドラッグ&ドロップが機能していないことも観察しています。テーブルビューには4つの列があり、そのうちの2つはカスタムセルです。非カスタムセルのドラッグは、セルセパレーターでも動作しているにもかかわらず、カスタムセルでは動作していません。
私のカスタムセルは、問題を引き起こしているNSButtonCellからサブクラス化されました。提案されているように、親クラスをnsbuttoncellからnsactioncellに変更しました。今、ドラッグは完全に機能しています。
NSACTIONCELLと同様にNSCELLの両方で動作しますが、セルでのアクションが必要なため、nsactioncellを使用しました。