問題タブ [responder-chain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - NSApp.sendAction() はしばらくすると機能します
子カスタム ビュー ( ChildView ) のクリックにViewController ( ContainerVC ) が反応するようにします。
ChildViewでは、クリックを処理するためにオーバーライドmouseDown(_:)
します。このメソッドでは、 を介してContainerVCターゲットを呼び出そうとしますNSApp.sendAction(#selector(ContainerVC.childViewClicked(_:)), to: nil, from: self)
。
なんらかの理由sendAction
で、最初はメソッドが失敗します (つまり、false を返します)。またNSApp.target(forAction: #selector(ContainerVC.childViewClicked(_:))
、ゼロです。
しばらくすると (通常、カスタム ビューをしばらくクリックした後)、ターゲットが解決され、すべてが正常に機能し、ContainerVC.childViewClicked(_:) が呼び出されます。
ターゲットが解決された時間/クリック数の後に体系的なパターンを見つけることができませんでした (私の Mac で叫ぶ激しさを除いて)。
興味深いことに、ContainerVCを 経由でウィンドウに追加すると、正常に動作しますlet window = NSWindow(contentViewController: ContainerVC())
。
ContainerVCを分割ビューに追加すると、上記の奇妙な動作が発生します。
CustomViewのレスポンダーチェーンを確認しました。予想どおり、 ContainerVCがチェーンに表示されます。childViewClicked(_:)を実装するチェーン内の他のクラスはありません。
NSApp.sendAction(_:) の内部動作と、ターゲットが最初に nil である理由について誰かが教えてくれれば幸いです。
ViewController を SplitView に追加して適切に接続するときに必要な追加の手順はありますか?
cocoa - NSSplitViewでkeyDown:イベントを処理するための適切な設計パターンは何ですか?
複雑な分割ビュー ベースのウィンドウ内のさまざまなサブビューごとに個別の KeyDown: ハンドラーが必要です。さらに、個々のサブビュー ハンドラーによって処理されないすべてのキーに対して、WindowController レベルで "グローバル" KeyDown: ハンドラーが必要です。
NSResponder ドキュメントの私の理解から、次のようなことができるはずです: (疑似コードで - 構文について文句を言わないでください。ここでアイデアをよりよく理解してください。)
しかし、未処理のキーは、私が期待したように、応答チェーンを WindowController に伝播しません。チェーンは ViewController で停止しているようです。
ここで何が欠けていますか?
ありがとう
(疑似コード)