OS X 菜单栏应用程序:如何将窗口置于前台

9

我正在开发一款仅有菜单栏的OS X应用程序,但是我在努力让设置窗口显示在其他应用程序前面。

应用程序设置

"仅有菜单栏的应用程序"意味着:

  • 我从主Storyboard文件的NSWindowController中删除了"Is Initial Controller"。我的应用程序不使用主Storyboard的窗口
  • 我在主Storyboard的"Application Scene"中添加了一个NSMenu。这将成为我的菜单栏菜单
  • 我将LSUIElement设置为YES以隐藏Dock图标
  • 我将LSBackgroundOnly设置为NO(参见NSWindow makeKeyAndOrderFront makes window appear, but not Key or Front

当应用程序启动时,我创建了一个NSStatusItem,并将Storyboard中的NSMenu作为其菜单添加到其中。这一切都很好 - 应用程序启动,没有窗口和Dock图标,只有一个包含Storyboard中菜单的菜单栏项目。

设置窗口

现在我想添加一个设置窗口,当单击菜单栏条目时显示。因此,我:

  • 创建了一个新的.xib文件,并在其中添加了一个NSWindow
  • 创建了一个自定义的NSWindowController,连接了输出和动作
  • 使用应用程序启动时的initWithNibNamed:实例化了自定义的NSWindowController

当单击菜单中的"设置"条目时,我尝试使用以下方法将设置窗口置于前台:

[self.settingsWindowController.window center];
[self.settingsWindowController.window showWindow:self];
[self.settingsWindowController.window makeKeyAndOrderFront:NSApp];

窗口已经显示,但没有置于前台,而是隐藏在其他应用程序后面。
有什么解决方法吗?谢谢!
2个回答

17

你需要调用:

[NSApp activateIgnoringOtherApps:YES];

(这是罕见的情况之一,传递YES到该方法是正确的。)

对于Swift,您可以使用

NSApp.activate(ignoringOtherApps: true)

2
当然!你是最棒的,谢谢,那绝对有效。 - BlackWolf
在一个基于文档的应用程序中,如何强制该应用程序显示其菜单,采用此精确设置?窗口正确显示,但没有出现菜单。来回切换应用程序可使菜单正确显示。 - Oscar Swanros

5

我知道您正在寻找obj-c的答案,而且已经得到了答复,但以防万一有人在谷歌上搜索Swift 4实现。

在扩展NSWindowController的类中定义该函数:

func bringToFront() {
  self.window?.center()
  self.window?.makeKeyAndOrderFront(nil)
  NSApp.activate(ignoringOtherApps: true)
}

然后,每当你想把它提到前面时,调用bringToFront()。

1
谢谢!对我来说,只需在我的“prepare for segue”函数中放置NSApp.activate(ignoringOtherApps: true)就可以了。从windowDidLoad调用bringToFront()没有效果。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接