5

NSWindowControllerNIB からウィンドウをロードするために使用しています。ただし、 を呼び出すshowWindow:と、ウィンドウは視覚的に一番上にありますが、フォーカスは (新しいウィンドウに移動するのではなく) 元の場所に残ります。

新しいウィンドウを作成する前に (cmd+n を使用)、最初のウィンドウ (キーボード フォーカスがある) をわずかに移動すると、これが発生することが簡単にわかります。これが結果です

。一番下のフォーカスされたウィンドウが元のウィンドウです。一番上のフォーカスされていないウィンドウは、新しく作成されたウィンドウです。

これは関連するコードです:

AppDelegate.h:

- (IBAction)newDocument:(id) sender;

AppDelegate.m:

- (IBAction)newDocument:(id) sender {
    [[[FooController alloc] init] showWindow:self];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self newDocument:self];
}

FooController.h:

@interface FooController : NSWindowController { }
@end

FooController.m:

- (id)init {
    self = [super initWithWindowNibName:@"FooWindow"];
    return self;
}

FooWindow.xib:
変更を加えていない、新しく作成された Window xib。

MainMenu.xib:
ウィンドウが削除されたデフォルトの MainMenu.xib。

makeKeyAndOrderFront:コントローラーのメソッドでウィンドウを呼び出してもwindowDidLoad、新しいウィンドウがフォーカスされないように見えます。FooWindow.xib のファイルの所有者を設定してFooControllerも、役に立たないようです。

キーボード フォーカスを受け取るように NIB からウィンドウを読み込んで表示する正しい方法は何ですか?

編集:NSWindowControllerwindowメソッドが を返すように見えますnil。これは、 on のメソッドを呼び出しwindowても何もしない理由を説明しています。しかし、なぜnilですか?

4

2 に答える 2

11

さて、私はこの問題の原因を見つけました。

xib のファイルの所有者はコントローラーに設定する必要があり、(これは私が知らなかった部分です) コントローラーのwindowアウトレットをウィンドウ自体に接続する必要があります。

それができたら、それはうまくいきます。いいえmakeKeyWindowmakeMainWindowまたはmakeKeyAndOrderFront:必要です。

于 2011-03-13T16:41:38.323 に答える
1

おそらくmakeMainWindow:またはmakeKeyWindow:が役立ちます

于 2011-03-13T12:49:04.133 に答える