5

parentサブビュー ( ) を持つビュー ( ) を考えてみましょうchild。どちらもドラッグされたタイプに登録されていNSFilenamesPboardTypeます。

parentchild画像ファイルと音声ファイルのみに関心があります。対応するタイプのファイルを検出すると、draggingEntered:が返されNSDragOperationCopyます。そうでない場合は、 を返しNSDragOperationNoneます。

childがオーバーラップparentし、ドラッグが に達すると、 がドラッグにchild興味があるかどうかに関係なくparent、メッセージを受け取ります。draggingExited:child

ドラッグを望まないparent場合、どうすればドラッグを受け取ることができますか?child

4

3 に答える 3

3

私がこれを正しく理解したら、あなたは電話するべきです:

[self.superview yourmethod];

子関数で。

子が親から継承されている場合は、次のように呼び出すことができます。

[super yourmethod];
于 2012-06-13T11:04:35.553 に答える
2

ここでできることはいくつかあります。

  1. @Thomas が述べたように、子ビューにロジックを実装して、ドラッグ イベントを親ビューに転送し、必要に応じてイベントを転送するかどうかを決定できます。

  2. ドラッグ メッセージを受信しないように子ビューを登録解除し ( [childView unregisterDraggedTypes])、parentView でドラッグのすべてのロジックを実装できます。基本的には、ドラッグのタイプと位置、およびドラッグが子ビューと交差するかどうかを計算することが考えられます。子ビューと交差する場合は、子ビューにドラッグ ロジックを適用します。それ以外の場合は、親ビューのドラッグ ロジックを適用します。draggingUpdated:これを達成するには、おそらく実装する必要があります。

于 2012-06-13T18:59:21.973 に答える
1

親を NSFilenamesPboardType に登録する唯一のものと見なすことができます。

UIResponderChain と同様に、サブビューごとにカテゴリを作成します。

- (NSView*) dragTest:(id< NSDraggingInfo >)sender;

戻り値が nil の場合、サブビュー (およびそのサブビュー) がドラッグ イベントを処理したくないことを意味します。

ここでparentviewに戻り、dragEntered:がトリガーされたら、位置を計算し、それがどのビューにあるかを調べ、dragTest:を呼び出して、対応するサブビューがそれを処理したいかどうかを確認します。返された null 以外のビューでイベントを処理するか、それ以外の場合は親で処理します。

この方法は、多くのレベルのサブビューがある場合に役立ちます。

于 2012-06-18T10:36:36.910 に答える