OS X菜单栏应用程序:如何将窗口带到前面

时间:2015-03-29 10:59:37

标签: objective-c xcode macos window nswindowcontroller

我正在为OS X开发一个仅限于菜单栏的应用程序,我正在努力获得一个设置窗口,以显示在其他应用程序前面。

应用设置

"仅限菜单栏的申请"的意思是:

  • 我删除了" Is Initial Controller"来自主故事板文件中的NSWindowController。主要故事板的窗口未在我的应用中使用
  • 我在"应用场景"中添加了NSMenu。在主要的故事板。这将成为我的菜单栏菜单
  • 我将LSUIElement设置为YES以隐藏停靠栏图标
  • 我将LSBackgroundOnly设置为NO(请参阅NSWindow makeKeyAndOrderFront makes window appear, but not Key or Front

当应用启动时,我会创建一个NSStatusItem并将故事板中的NSMenu添加为菜单。这一切都很好 - 应用程序启动,没有窗口,没有停靠图标,但是菜单项目包含故事板中的菜单。

设置窗口

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

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

当点击菜单中的"设置" -entry时,我尝试使用以下设置窗口:

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

显示窗口,但不会显示在前面,而是隐藏在其他应用程序后面。

任何想法如何解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:11)

您需要致电:

[NSApp activateIgnoringOtherApps:YES];

(这是将YES传递给该方法的极少数情况之一。)

答案 1 :(得分:2)

我知道你已经要求obj-c并且已经收到了答案,但是只要谷歌搜索Swift 4就可以了。

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

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

然后,无论何时想要提起它,请调用bringToFront()。