2011-12-26 7 views
0

アプリケーションメニューの私のCocoaアプリケーションには、最初のレスポンダにdelete:メッセージを送信するメニュー項目「削除」があります。今、私はキーボードのフォーカスをNSOutlineViewにしています。これはこの場合の最初のレスポンダーです。 NSOutlineViewをサブクラス化するのに間に合わず、delete:メッセージがそれに渡されるように処理する方法はありますか? NSOutlineViewDelegateNSOutlineViewDataSourceも、これらのアクションを処理するための興味深いものを定義していないようです。NSResponderデリゲートのようなものはありますか?

+0

サブクラス化に対するあなたの反対は何ですか?シンプルで、あなたが望むものを実現します。 –

+0

これは確かに結果を達成しますが、それらのグルー要素を処理することは、ビューの代わりにコントローラの役割と思われます。さらに、Cocoaはデリゲートパターンを大いに支持しているので、おそらく、これらのタスクを処理する組み込みの代理人がいると思います。 – Tony

答えて

2

最初のレスポンダは、最初のレスポンダです。興味のないものはの次のレスポンダに転送します。これは、メッセージがアプリケーションオブジェクトに到達するまで順番に転送されます。

このメッセージを処理するために必要なのはレスポンダチェーン内です。ウィンドウコントローラは良い方法です。ウィンドウの次のレスポンダになります。

“Event Architecture” in the Event-Handling Guideを参照してください。

+1

アーキテクチャの観点からは、ウィンドウコントローラがテーブル/アウトラインビューのローカルな "コピー"、 "貼り付け"、 "削除"イベントを処理するのが面倒ではないでしょうか?これらのメソッドは、ビューがバインドする配列/ツリーコントローラまたはビューのデリゲートで処理するのが最適ですが、NSArrayControllerとNSTreeControllerはNSRespondersではなく、レスポンダチェーン内にはありません。 – Tony

+1

カスタムNSViewControllerオブジェクトを使用して、個々のビューをそれぞれ管理し、レスポンダチェーンにビューコントローラを挿入することができます。ビューコントローラは、コピーとペーストなどを処理できます。 –

+0

@トニー:ウィンドウコントローラがデータを所有するオブジェクト(ドキュメントなど)を所有している、または知っている場合はありません。ウィンドウコントローラは、ビューとウィンドウとモデルコントローラの中間に存在します。ビューがカット、コピー、貼り付け、および削除を(バインディングまたはデータソースメッセージを使用して)処理した場合、ビューを追加するサブクラスを作成しない限り、ビューは最適ではありません。 –

関連する問題