質問

私はNSControlサブクラスとしてタブバービューを実装しました。

画像の入力ここで

クリックすると、AppKitはNSWindowのfirstResponderを更新しようとします。タブバーがfirstResponderになることを望まないため(acceptsFirstResponderNOを返します)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];
    }
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top