【问题标题】:How to give focus to NSWindow loaded from NIB?如何将焦点放在从 NIB 加载的 NSWindow 上?
【发布时间】:2011-03-13 12:39:52
【问题描述】:

我正在使用 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,其窗口已删除。

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

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

编辑: 看起来NSWindowControllerwindow 方法返回nil,这就解释了为什么在window 上调用方法不起作用。但是为什么是nil呢?

【问题讨论】:

    标签: cocoa nswindow nswindowcontroller


    【解决方案1】:

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

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

    完成后,它就可以工作了。不需要makeKeyWindowmakeMainWindowmakeKeyAndOrderFront:

    【讨论】:

    • 显然是一个非常古老的答案,但没有正确配置后的实际屏幕截图,这还不够具体。
    【解决方案2】:

    也许 makeMainWindow: 或 makeKeyWindow: 有帮助

    【讨论】:

    • windowDidLoad 调用这些不会聚焦新窗口。也许应该从其他地方调用它们?
    • 我认为应该在 makeKeyAndOrderFront: call 之后调用它们
    • 这就是我之前尝试过的。无论makeKeyAndOrderFront:makeMainWindowmakeKeyWindow的组合和顺序我输入windowDidLoad,新窗口都没有获得焦点。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2011-02-08
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多