2

単純なものが欠けているに違いありませんが、見えません。まず、セットアップ:

  • DATreeView、のサブクラスNSView
  • DATreeViewController、のサブクラスNSViewController
  • MainMenu.xibDATreeViewControllerからビューをロードするように構成された のインスタンスがありますDATreeView.xib
  • MainMenu.xibのインスタンスもありDendreaAppDelegate、アウトレットがあります (のインスタンスDATreeViewControllerに配線されています) 。MainMenu.xibDATreeViewController
  • Do Something!doSomething:、ファーストレスポンダにメッセージを送信するために接続されたメニュー項目です。
  • 偶然でDATreeViewControllerはなく、 というアクションがありdoSomething:ます。

私が望むのは、Do Something!メニュー項目が でdoSomething:アクションをトリガーするDATreeViewControllerことです。ターゲット/アクション接続を直接設定することはできないふりをしましょう。ここで立ち止まって質問します。私の設計は完全に間違っていますか? 私がやろうとしていることは、私の神の目に愚か/悪/恥をかかせる可能性がありますか?

いいえ?偉大な。さて、私の人生では、メニュー項目をアクティブにすることはできません。違いがある場合は、Snow Leopardでこれを行っています。

NSViewとの間の適切な統合を実現するためにNSViewController、たとえばレスポンダー チェーンの管理など、 Matt Gallagher の例に従いましたが、実質的な変更が 1 つNSViewありsetViewController:ます。DATreeViewControllerloadViewメッセージ。私が知る限り、次のコードを実行した後applicationDidFinishLaunching:

NSView *view = self.treeViewController.view;
[self.window.contentView addSubview:view];

レスポンダー チェーンは期待どおりに設定されます。つまり、次のようになります。

NSWindow < NSView < DATreeViewController < DATreeView

レスポンダ チェーンの一部でDATreeViewControllerあり、 に応答しdoSomething:、検証を実装していないため、Interface Builder を使用してDo Something!メニュー項目を First Responder プロキシに接続するだけでよいと思っていました。をdoSomething:アクションとして使用すると、メニュー項目が自動的にアクティブになります。

私は何を間違っていますか?かけがえのない支援をありがとうございました!

4

3 に答える 3

3

あなたの見解は受け入れられ、首尾よくファーストレスポンダーになりますか?

于 2009-10-01T05:22:24.823 に答える
0

DATreeViewController は IB の DATreeView の viewController アウトレットに配線されていますか?

setViewController: と setNextResponder: をトレースして、nextResponder が適切に設定されていることを確認しましたか?

于 2009-10-01T05:24:20.127 に答える
0

レスポンダーチェーンは、NSResponderなどのスーパークラスのメッセージに対してのみ機能します。カテゴリを追加して他のメソッドをバブルアップするmouseDown mouseExitedことで、何か卑劣なことを行うことができると思います。NSRespondernextRespondernextResponder

これは、この手法の例のようです: https://github.com/MrNoodle/NoodleKit/blob/master/NSResponder-NoodleModalExtensions.m

于 2016-04-26T21:48:22.230 に答える