1

非C環境でCocoaのドラッグアンドドロップAPIを使用することに取り組んでいます。objc / runtime.h関数を使用する必要があるため、必要なメソッドをどこに挿入する必要があるかを正確に理解する必要があります。

現在、SDKのドキュメントには、NSViewまたはNSWindowオブジェクトで最初にregisterForDraggedTypesを呼び出すことが記載されています。さらに、これらのクラスは両方ともNSDraggingDestinationプロトコルのスタブを実装し、それらのスタブメソッドを上書きする必要があることをさらに説明します(少なくともdraggingEntered:とperformDragOperation:が必要です。残りはオプションです)。

ここまでは順調ですね。

ただし、これらのメソッドをウィンドウのコントローラー、つまりNSWindowControllerタイプのクラスに実装することもできることがわかりました。例として、Appleの「DemoMonkey」サンプルを使用してこれを行いました。ここでは、必要な呼び出しをDisplayController(NSWindowController)に実装し、「self.window」でregisterForDraggedTypesを呼び出しました。

これはどのように機能しますか?

つまり、この場合、registerForDraggedTypes呼び出しを受け取ったオブジェクトは、これらのドラッグコールバックを要求する必要があることを知っているので、コントローラーとどのように関連していますか?これがこのように機能することはどこに文書化されていますか?

これは、NSWindowControllerがNSResponderであるという事実と関係があるのだろうか。実際、NSDraggingDestinationの呼び出しはレスポンダーチェーンを介して実行されますか?(記録のために:NSResponderのサブクラスを作成し、コントローラークラスの代わりにそこにコールバックを実装し、そのインスタンスを作成して「self.window makeFirstResponder:」を呼び出しようとしましたが、それは実現しませんでしたウィンドウ上でデータをドラッグするときに呼び出されるコールバック。)

誰かがこの振る舞いを明確にし、この事実がどこに文書化されているかを説明できますか(または、これは単に文書化されていない振る舞いであり、したがって信頼されるべきではありませんか?)

4

1 に答える 1

1

これはregisterForDraggedTypes:、ウィンドウに送信し、NSWindowController が NSWindow のデリゲートであるために発生します。

これについては、「ドラッグ アンド ドロップ プログラミングのトピック」に記載されています。

NSDraggingDestination は非公式のプロトコルとして宣言されていますが、プロトコルを採用するために作成する NSWindow および NSView サブクラスは、関連するメソッドのみを実装する必要があります。(NSWindow および NSView クラスは、すべてのメソッドに対してプライベートな実装を提供します。) ウィンドウ オブジェクトまたはそのデリゲートは、これらのメソッドを実装できます。ただし、両方の場所に実装がある場合は、デリゲートの実装が優先されます。

NSWindow のregisterForDraggedTypes:のドキュメント:

ドラッグされたタイプの NSWindow オブジェクトを登録すると、自動的にドラッグ セッションの対象オブジェクトの候補になります。NSWindow には、NSDraggingDestination プロトコルの多くのメソッドのデフォルト実装があります。デリゲートがメッセージのセレクターに応答する場合、デフォルトの実装は各メッセージをデリゲートに転送します。この方法で転送されるメッセージは、dragEntered:、dragUpdated:、dragExited:、prepareForDragOperation:、performDragOperation:、および confirmDragOperation: です。

registerForDraggedTypes:これは、「ドロップ ビュー」のようなものを実装して NSViewを呼び出したい場合には発生しません。次に、すべてのメッセージを自分でコントローラーに転送する必要があります。どちらの場合でも、コントローラーはドラッグ アンド ドロップ処理のコードに適した場所だと思います。

于 2013-10-16T09:29:31.320 に答える