2011-03-13 24 views
4

我使用NSWindowController從NIB加載窗口。但是,當我打電話給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加載和顯示窗口的正確方法是什麼,以便它確實接收鍵盤焦點?

編輯:看起來NSWindowControllerwindow方法返回nil,這就解釋了爲什麼呼籲window方法沒有做任何事情。但爲什麼它是nil

回答

10

好吧,我發現這個問題的原因。

必須將xib的文件所有者設置爲控制器,並且(這是我不知道的部分),您必須將控制器的出口連接到窗口本身。

完成後,它就可以工作。不需要makeKeyWindow,makeMainWindowmakeKeyAndOrderFront:

1

也許makeMainWindow:或makeKeyWindow:幫助

+0

從'windowDidLoad'調用它們不會聚焦新窗口。他們是否應該從其他地方撥打電話? – Zr40

+0

我認爲應該在makeKeyAndOrderFront之後調用它們:調用 – lbrndnr

+0

這就是我以前的嘗試。無論「makeKeyAndOrderFront:」,「makeMainWindow」和「makeKeyWindow」的組合和順序如何,我放入'windowDidLoad'中,新窗口都不會獲得焦點。 – Zr40

相關問題