2

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

URL をビューにドロップできるドラッグ アンド ドロップ動作を実装したいと考えています。すべてがメインビューですでに機能しています。

したがって、実際には、子ビューと親ビュー クラスにドラッグ動作ハンドラーを実装する必要があります。問題は、完全な処理コードをすべての子ビューにコピーして、ドラッグ イベントも受け入れるようにしたくないということです。そのため、すべてのドラッグ イベントを親ビューに転送できるようにするのが最善の方法であると考えました。

これはどういうわけか可能ですか?? おそらくレスポンダーチェーンでこれを設定できるかどうかわかりませんか?

どんなヒントでも大歓迎です!! 前もって感謝します。

4

4 に答える 4

6

ビューにドロップされたもの、またはそのサブビューのいずれかがビューによって処理されるようにしたいという同様の問題に直面しましたが、呼び出しはそこに到達しませんでした。

いくつかの調査の結果、この回答が最も役立つことがわかりました: https://stackoverflow.com/a/7389711/327471

基本的に、ビューがドラッグ イベントを受信するように登録されていない場合、その情報は親ビューに自動的に渡されます。したがって、私の場合、次のような結果になりました。

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

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

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

于 2012-01-09T02:29:03.957 に答える
2

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

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

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

于 2011-11-25T00:42:32.427 に答える
-1

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

于 2012-01-09T02:58:57.360 に答える