2011-03-13 7 views
4

NIBからウィンドウをロードするのにNSWindowControllerを使用しています。しかし、showWindow:と呼ぶと、ウィンドウは視覚的に一番上になりますが、フォーカスは元の位置に残ります(新しいウィンドウに移動するのではなく)。NIBからロードされたNSWindowに焦点を当てるには?

新しいウィンドウを作成する前に(キーボードフォーカスのある)最初のウィンドウをわずかに動かすと、これが起こるのは簡単です(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:修正なし
新たに作成されたウィンドウのXIB、。

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

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

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

編集:それは何もしませんwindow上のメソッドを呼び出す理由を説明NSWindowControllerwindow方法nilを返す、のように見えます。しかし、それはなぜnilですか?

答えて

10

を助け、私はこの問題の原因を発見しました。

xibのファイルの所有者がコントローラに設定されている必要があります。これはコントローラのwindowコンセントをウィンドウ自体に接続する必要があります。

これを実行しただけで動作します。いいえmakeKeyWindow,makeMainWindowまたはmakeKeyAndOrderFront:が必要です。

1

おそらくmakeMainWindow:またはmakeKeyWindowは:オーケー

+0

これらを 'windowDidLoad'から呼び出すと、新しいウィンドウはフォーカスされません。彼らはおそらく他の場所から呼ばれるべきでしょうか? – Zr40

+0

私は彼らがmakeKeyAndOrderFrontの後に呼び出されるべきだと思います: – lbrndnr

+0

これは前に試したことです。 'makeKeyAndOrderFront:'、 'makeMainWindow'と' makeKeyWindow'を 'windowDidLoad'に組み込んでも、新しいウィンドウはフォーカスを取得しません。 – Zr40

関連する問題