1

テーブル ビューの文字列からコレクション ビューにドラッグ アンド ドロップする方法を知りたいです。collectionView のドラッグ アンド ドロップ用のデリゲート メソッドがあることは知っていますが、それらを実装する方法の例が見つかりません。コレクション ビューをセットアップしました。正しく動作しているように見えますが、終了方法がわかりません。

どんな助けでも大歓迎です。

更新: 私が取り組んでいるコレクション ビューのセットアップには、コレクション アイテムごとに 3 つの NSTextFields と 2 つのチェック ボックスがあります。同じビューに tableView もあります。テーブル ビューには、文字列の MutableArray が渡されます。テーブル ビューの行からコレクション ビュー アイテムの適切な textFields に文字列値をドラッグできるようにしたいと考えています。

これは、コレクション ビューでドラッグ アンド ドロップを使用する一般的な方法とは異なります。

4

1 に答える 1

0

私は今日これを理解するのにかなりの時間を費やしたので、私自身の質問に答えるつもりです. 多くの人がこの手順に苦労しています.

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 に変更し、コレクション ビューで各テキスト フィールドを選択し、インスペクターで新しいクラス名を割り当てます。または、他のソースからドラッグしている場合は、適切なドラッグ ソース デリゲートが設定されていることを確認してください。

于 2012-02-03T06:59:11.593 に答える