私は今日これを理解するのにかなりの時間を費やしたので、私自身の質問に答えるつもりです. 多くの人がこの手順に苦労しています.
NSTextField のデフォルトの動作では、フォーカスがある場合に実際にドロップできることがわかりました。問題は、マウス入力イベントに自動フォーカスするために適切な NSTextField が必要なことです。結局のところ、NSCollectionView のドラッグ アンド ドロップ デリゲートは必要ありませんでした。NSTableView ドラッグ デリゲートが必要で、NSTextField をサブクラス化し、マウス イベント (ドロップ) デリゲートを実装する必要がありました。
したがって、元の collectionViewItem のクラスは次のようになります。
//someClass.h
@interface SomeClass : NSObject{
IBOutlet NSTextField *field1_;
IBOutlet NSTextField *field2_;
IBOutlet NSTextField *field3_;
IBOutlet NSButton *chkBox1_;
IBOutlet NSButton *chkBox2_;
}
@porperty(readwrite, copy) NSTextField *filed1_;
プロパティは、バインドの目的で 5 つのアウトレットすべてに対して作成されます。Mac OSX Dev Library のチュートリアルに従う場合; コレクション ビュー プログラミング ガイドでは、コレクション ビューをセットアップするプロセスについて説明しますが、バインディングを使用します。
ここで重要なのは、textField サブクラスを設定することです //MyNSTextField.h #import @interface MyNSTextField : NSTextField{
//mouse positioning
unsigned long last_;
}
//MyNSTextField.m
#import "MtTextField.h"
@implementation
-(void)dealloc{
[super dealloc];
}
-(void)awakeFromNib{
//register for dragged types
//any other nib stuff
}
//three required mouse events
-(unsigned long)draggingEntered:(id<NSDraggingInfo>)sender{
//this forces the textfield to focus before drop
[self.window makeFirstResponder: self];
NSPasebord *pBoard;
self->last_ = DragOperationNone;
pBoard = [sender draggingPastboard];
return self->last_;
}
-(unsigned long)draggingUpdated:(id<NSDraggingInfo>)sender{
return self->last_;
}
-(void)draggingExited:sender{
if([sender draggingSource] != self){
self->last = NSDragOperationNone;
}
}
}// クラス終了
元のクラスに戻り、textField アウトレットの名前を NSTextField から MyNSTextField に変更し、コレクション ビューで各テキスト フィールドを選択し、インスペクターで新しいクラス名を割り当てます。または、他のソースからドラッグしている場合は、適切なドラッグ ソース デリゲートが設定されていることを確認してください。