如何关注从NIB加载的NSWindow?

时间:2011-03-13 12:39:52

标签: cocoa nswindow nswindowcontroller

我正在使用NSWindowController从NIB加载窗口。但是,当我调用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加载和显示窗口的正确方法是什么,以便它确实接收键盘焦点?

修改NSWindowController的{​​{1}}方法返回window,这解释了为什么调用nil上的方法不行任何东西。但为什么它是window

2 个答案:

答案 0 :(得分:11)

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

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

完成后,它才有效。不需要makeKeyWindowmakeMainWindowmakeKeyAndOrderFront:

答案 1 :(得分:1)

也许makeMainWindow:或makeKeyWindow:help