NSWindow makeKeyAndOrderFront使窗口显示,但不显示Key或Front

cks*_*ubs 20 macos cocoa objective-c

makeKeyAndOrderFront 不是我的NSWindow钥匙或前面.

我的应用程序没有主窗口或菜单栏,这可能是问题的一部分?

IBOutlet NSWindow *loginWindow;
//(connected in Interface Builder to the NSWindow)
Run Code Online (Sandbox Code Playgroud)

NSWindow"在发布时可见"和"关闭后释放"都未经检查.

然后:

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [loginWindow makeKeyAndOrderFront:self];
}
Run Code Online (Sandbox Code Playgroud)

确实打开了窗户.(评论它导致没有窗口被打开).

然而:

  • 它出现在Xcode窗口后面(不是前面).

  • 它似乎可以接收鼠标焦点,但不会在窗口包含的文本字段中获取按键.按键被发送到Xcode.

  • 激活Expose时,它将显示在Expose网格中.但我无法点击窗口在Expose中选择它...它不会出现在前面.

为什么我的Window不工作?

ms8*_*s83 31

尝试调用此方法[NSApp activateIgnoringOtherApps:YES];.这应该使它成为活跃的应用程序.

  • PS我实际上最终需要使用这个`activateIgnoringOtherApps`命令,除了将`LSUIElement`添加到Info.plist. (2认同)

Pet*_*sey 26

在黑暗中刺:你已经LSBackgroundOnly在Info.plist中设置了.这就是使它不起作用的原因:只有后台的应用程序无法到达前台,这就是为什么你的窗口没有到达前台的原因.

如果您希望应用程序不显示在Dock中,请LSUIElement改为设置.这会抑制应用程序的Dock磁贴,并使其不会在菜单栏中显示自己的主菜单,但保留了将窗口放在最前面并使其成为密钥的能力.

  • @cksubs:是的:`NSBGOnly`被重命名为`LSBackgroundOnly`.仅弃用旧名称; `LSUIElement`和`LSBackgroundOnly`都是最新的,但做不同的事情.它们和所有其他当前密钥都记录在信息属性列表主要参考中:http://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/ (2认同)

Sam*_*fes 8

这两个答案都是正确的。canBecomeKey如果窗口子类是无边框的,您还需要确保覆盖它。

这花了很长时间才弄清楚。(我写了一篇关于我的整个解决方案的博客文章。)