1

1 つの既存のアプリケーションをアップグレードする必要があり、その既存の UI を個別の NIB に分割する必要があります。分割されたすべての UI に対して個別の NIB と NSViewController を作成することから始める予定です。問題は、NSViewController がキーボード TAB および SHFIT+TAB イベントに応答しなかったことです。ユーザーが TAB または SHIFT+TAB をクリックしたときに、NSViewController が動的にロードされた NSViewController ビューの適切な子コントロールにフォーカスを設定するようにしたいだけです。

ありがとう、

EDITED:以下は私の要件です。

動的にロードして、MainWindow プレースホルダー NSBox で NSPopupButton を使用して切り替える必要がある 3 つのサブビューがあります。

確認のために、新しいココア アプリを作成し、1 つの NSPopupButton と NSBox を Window に追加し、NSPopupButton と NSBox のアウトレットに参加しました。

次に、2 つまたは 3 つの NSTextField の子コントロールを含む別のカスタム ビューを含む 3 つの異なる NIB を持つ 3 つの新しい NSViewController を作成しました。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
}

メインアプリのデリゲート関数では、3 つの NSViewController をすべて配列に追加し、後で replaceSubview を使用してビューを交換して、プレースホルダー NSBox のビューを置き換えます。

3 つの NSViewController のすべてに次のコードを追加しましたが、TAB または SHIFT+Tab キーを押してもまだ子コントロールにフォーカスできません。

- (void)loadView {
    [super loadView];

    // store the responder that’s right after the view in the responder chain
    NSResponder *nextResponder = [[self view] nextResponder];

    // set the view controller (self) as the next responder after the view
    [[self view] setNextResponder:self];

    // set the stored responder as the next responder after the view controller
    [self setNextResponder:nextResponder];
}
4

1 に答える 1

2

NSViewControllerから継承していますが、Cocoa はレスポンダー チェーンにインスタンスをNSResponder自動的に追加しません。自分でやる必要があります。NSViewController

考えられる解決策の 1 つは、ビュー コントローラーが制御しているビューとそのビューの次のレスポンダーの間のレスポンダー チェーンにビュー コントローラーを挿入することです。たとえば、View Controller の実装では、

- (void)loadView {
    [super loadView];

    // store the responder that’s right after the view in the responder chain
    NSResponder *nextResponder = [[self view] nextResponder];

    // set the view controller (self) as the next responder after the view
    [[self view] setNextResponder:self];

    // set the stored responder as the next responder after the view controller
    [self setNextResponder:nextResponder];
}
于 2011-02-16T07:32:09.787 に答える