親ビューにドラッグ&ドロップイベントを転送する

NSViewから派生した1つのカスタムビューを持つアプリケーションがあります。 このビューには、NSViewから派生したカスタムサブビューがいくつかあります。

ドラッグ&ドロップの動作を実装して、URLをビューにドロップできるようにしたい。メインビューではすべてが既に機能しています。

したがって、実際には、子ビューと親ビュークラスでドラッグビヘイビアハンドラを実装する必要があります。 つまり、完全な処理コードをすべての子ビューにコピーして、ドラッグイベントを受け入れるようにしたくないということです。だから私は、すべてのドラッグイベントを親ビューに転送させるのが最善の方法だと思った。

これは何とかできますか?私がどうにかレスポンダーチェーンでこれを設定できるかどうかわからない?

どのようなヒントも高く評価されています! 前もって感謝します。

2

3 答え

私は同様の問題に直面していましたが、何かがビューに落ちたかったり、サブビューがビューによって処理されたりすることはありませんでしたが、コールは決してそこに届きませんでした。

After some research I found this answer to be the most helpful: https://stackoverflow.com/a/7389711/327471

基本的に、ビューがドラッグイベントを受け取るように登録されていない場合は、その情報を親ビューに自動的に渡す必要があります。だから私の場合、私はこのようなもので終わった:

NSArray *subviews = [self.view subviews];
for (NSView *aSubview in subviews) {
    [aSubview unregisterDraggedTypes];
}

もちろん、それよりも正確なことができますし、特定のタイプのサブクラスや必要なパラメータだけを確認してください。しかし、最終的には、キーはドラッグされたタイプから問題のサブビューを登録解除していました。

私はこれが役立つことを願っています

3
追加された
これは私が必要とするものとまったく同じです!今夜それを試してみよう!あなたのタイミングは最高です。昨日最後の問題を修正しなければならない問題もありました。だから私はすぐにこの正確な話題に関する新しい質問をしたでしょう。ありがとう。私の一日を作った!
追加された 著者 guitarflow,
試した後、私はそれが動作しないと思った...私が知る限り、私のカスタムビューには、完全なビューのオーバーレイとして陰影イメージを表示するNSImageViewが含まれています。これは私のドラッグイベントをすべて食べました。 unregisterDraggedType は私の問題を解決しました。どうもありがとうございました!!
追加された 著者 guitarflow,

サブビューが表示専用に使用され、ユーザーの操作が不要な場合は、親ビューで -hitTest:を次のようにオーバーライドできます。

- (NSView *)hitTest:(NSPoint)aPoint
{
    NSView* hitView = [super hitTest:aPoint];
    if(hitView)
        return self;
    return nil;
}

これにより、親ビューはすべてのマウスイベントを受信します。

2
追加された
残念ながら、私の子ビューもマウスクリックイベントを受け取ります。他のアイデア?
追加された 著者 guitarflow,
mouse-clickイベントを個別に伝播するには、親ビューでmouseUp:をオーバーライドし、サブビューの1つの矩形の内側にある場合はそれを伝播します。非常にエレガントではない:)
追加された 著者 Mark Aufflick,

おそらくもっと良い方法ですが、ドラッグするプロトコルの実装を直接ビューではなくカテゴリに入れ、それぞれのビューにそのカテゴリを含めることができます。

0
追加された