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

Bla*_*olf 3 macos xcode window objective-c nswindowcontroller

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

应用设置

"仅限菜单栏的申请"是指:

  • 我从NSWindowController主故事板文件中删除了"Is Initial Controller" .主要故事板的窗口未在我的应用程序中使用
  • NSMenu在主故事板中添加了一个"应用程序场景".这将成为我的菜单栏菜单
  • 我设置LSUIElementYES隐藏的Dock图标
  • 我设置LSBackgroundOnlyNO(参见NSWindow makeKeyAndOrderFront使窗口出现,但不是Key或Front)

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

设置窗口

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

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

单击菜单中的"设置" - 条目时,我会尝试使用以下设置窗口:

[self.settingsWindowController.window center];
[self.settingsWindowController.window showWindow:self];
[self.settingsWindowController.window makeKeyAndOrderFront:NSApp];
Run Code Online (Sandbox Code Playgroud)

窗口显示,但没有显示在前面,而是隐藏在其他应用程序后面.

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

Ken*_*ses 12

你需要打电话:

[NSApp activateIgnoringOtherApps:YES];
Run Code Online (Sandbox Code Playgroud)

(这是传递YES给该方法的正常情况之一.)

  • 当然!谢谢你,你就是那个绝对有效的人。 (2认同)

Abu*_*ish 5

我知道您正在询问 obj-c 并且已经收到了答案,但以防万一有人在 Google 上搜索 Swift 4 实现。

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

func bringToFront() {
  self.window?.center()
  self.window?.makeKeyAndOrderFront(nil)
  NSApp.activate(ignoringOtherApps: true)
}
Run Code Online (Sandbox Code Playgroud)

然后每当你想调出它时,调用bringToFront()。