NSControlサブクラスはFirstResponderを変更してはいけません
-
13-12-2019 - |
質問
私はNSControlサブクラスとしてタブバービューを実装しました。
クリックすると、AppKitはNSWindowのfirstResponder
を更新しようとします。タブバーがfirstResponder
になることを望まないため(acceptsFirstResponder
はNO
を返します)NSWindow自体がfirstResponder
になるでしょう。私のレスポンダーチェーンはウィンドウで構成され、それはコントローラであり、対処メッセージはタブバーの下のサブビューに配信されません(NSOutLineView)。タブバーをクリックすると、NSOUTLINEVIEWがアクションメッセージとイベントを受信し続けてください。
これをするのに適切な方法は何ですか?クリックしたときにfirstResponder
を変更しようとしているのを停止する方法はありませんか?
ツールバーのnextResponder
をNSOutLineViewに設定することについて考えたが、NSVIEWのnextResponder
を手動で変更することは、Appleによって推奨されない。
解決
私のタブバーのデリゲートメソッド実装のアウトラインビューにfirstResponder
を手動でリセットしました。
タブバーがfirstResponder
になった場合、Tabbarにこれを実装しています。
- (void)awakeFromNib {
[self.window addObserver:self
forKeyPath:@"firstResponder"
options:NSKeyValueObservingOptionOld
context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
NSResponder *oldResponder = [change objectForKey:NSKeyValueChangeOldKey];
if (self.window.firstResponder == self) {
[self.window makeFirstResponder:oldResponder];
}
}
. 所属していません StackOverflow