如何关注从NIB加载的NSWindow?

Zr4*_*r40 4 cocoa nswindow nswindowcontroller

我正在使用NSWindowController从NIB加载窗口.但是,当我调用时showWindow:,窗口在视觉上是最顶层的,但焦点仍然保持原样(而不是将其移动到新窗口).

在创建新窗口(通过cmd + n)之前,第一个窗口(具有键盘焦点)稍微移动时,很容易看到这种情况发生.这是结果:

底部聚焦窗口是原始窗口.顶部未聚焦的窗口是新创建的窗口.

这是相关代码:

AppDelegate.h:

- (IBAction)newDocument:(id) sender;
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m:

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

FooController.h:

@interface FooController : NSWindowController { }
@end
Run Code Online (Sandbox Code Playgroud)

FooController.m:

- (id)init {
    self = [super initWithWindowNibName:@"FooWindow"];
    return self;
}
Run Code Online (Sandbox Code Playgroud)

FooWindow.xib:
一个新创建的Window xib,没有修改.

MainMenu.xib:
默认的MainMenu.xib,其窗口已删除.

makeKeyAndOrderFront:在控制器windowDidLoad方法中调用窗口似乎不会聚焦新窗口.将文件的FooWindow.xib所有者设置为似乎FooController也没有帮助.

从NIB加载和显示窗口的正确方法是什么,以便它确实接收键盘焦点?

编辑:它看起来像NSWindowControllerwindow方法的返回值nil,这就解释了为什么调用方法window没有做任何事情.但为什么呢nil

Zr4*_*r40 11

好的,我找到了这个问题的原因.

必须将xib的File所有者设置为控制器,并且(这是我不知道的部分)您必须将控制器的window插座连接到窗口本身.

完成后,它只是工作.不makeKeyWindow,makeMainWindowmakeKeyAndOrderFront:需要.