OS X 菜单栏应用程序:如何将 window 置于最前面
OS X Menubar application: How to bring window to front
我正在为 OS X 开发一个只有菜单栏的应用程序,我正在努力让设置 window 显示在其他应用程序的前面。
应用设置
"Menubar-only application" 表示:
- 我从主故事板文件的
NSWindowController
中删除了 "Is Initial Controller"。主故事板的 window 未在我的应用程序中使用
- 我在主故事板的 "Application Scene" 中添加了一个
NSMenu
。这将成为我的菜单栏菜单
- 我将
LSUIElement
设置为 YES
以隐藏停靠栏图标
- 我将
LSBackgroundOnly
设置为 NO
(参见 NSWindow makeKeyAndOrderFront makes window appear, but not Key or Front)
当应用程序启动时,我创建了一个 NSStatusItem
并从情节提要中添加了 NSMenu
作为它的菜单。这一切工作正常 - 应用程序启动,没有显示 window 也没有停靠栏图标,而是一个包含故事板菜单的菜单栏项目。
设置window
我现在想添加一个设置 window,当单击菜单栏条目时会显示该设置。我因此:
- 创建了一个新的 .xib 文件并向其添加了
NSWindow
- 创建了一个自定义
NSWindowController
连接出口和行动
- 在应用程序启动时使用
initWithNibNamed:
实例化自定义 NSWindowController
单击菜单中的 "Settings" 条目后,我尝试使用以下方法将设置 window 置于最前面:
[self.settingsWindowController.window center];
[self.settingsWindowController.window showWindow:self];
[self.settingsWindowController.window makeKeyAndOrderFront:NSApp];
window 显示了,但没有带到前面而是隐藏在其他应用程序后面。
有什么解决办法吗?谢谢!
您需要致电:
[NSApp activateIgnoringOtherApps:YES];
(这是将 YES
传递给该方法是正确的罕见情况之一。)
对于Swift你可以使用
NSApp.activate(ignoringOtherApps: true)
我知道您要求的是 obj-c 并且已经收到了答复,但以防万一有人在谷歌上搜索 Swift 4 实现。
在扩展 NSWindowController 的 class 中定义函数:
func bringToFront() {
self.window?.center()
self.window?.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
}
然后,无论何时你想调出它,调用 bringToFront()。
我正在为 OS X 开发一个只有菜单栏的应用程序,我正在努力让设置 window 显示在其他应用程序的前面。
应用设置
"Menubar-only application" 表示:
- 我从主故事板文件的
NSWindowController
中删除了 "Is Initial Controller"。主故事板的 window 未在我的应用程序中使用 - 我在主故事板的 "Application Scene" 中添加了一个
NSMenu
。这将成为我的菜单栏菜单 - 我将
LSUIElement
设置为YES
以隐藏停靠栏图标 - 我将
LSBackgroundOnly
设置为NO
(参见 NSWindow makeKeyAndOrderFront makes window appear, but not Key or Front)
当应用程序启动时,我创建了一个 NSStatusItem
并从情节提要中添加了 NSMenu
作为它的菜单。这一切工作正常 - 应用程序启动,没有显示 window 也没有停靠栏图标,而是一个包含故事板菜单的菜单栏项目。
设置window
我现在想添加一个设置 window,当单击菜单栏条目时会显示该设置。我因此:
- 创建了一个新的 .xib 文件并向其添加了
NSWindow
- 创建了一个自定义
NSWindowController
连接出口和行动 - 在应用程序启动时使用
initWithNibNamed:
实例化自定义NSWindowController
单击菜单中的 "Settings" 条目后,我尝试使用以下方法将设置 window 置于最前面:
[self.settingsWindowController.window center];
[self.settingsWindowController.window showWindow:self];
[self.settingsWindowController.window makeKeyAndOrderFront:NSApp];
window 显示了,但没有带到前面而是隐藏在其他应用程序后面。
有什么解决办法吗?谢谢!
您需要致电:
[NSApp activateIgnoringOtherApps:YES];
(这是将 YES
传递给该方法是正确的罕见情况之一。)
对于Swift你可以使用
NSApp.activate(ignoringOtherApps: true)
我知道您要求的是 obj-c 并且已经收到了答复,但以防万一有人在谷歌上搜索 Swift 4 实现。
在扩展 NSWindowController 的 class 中定义函数:
func bringToFront() {
self.window?.center()
self.window?.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
}
然后,无论何时你想调出它,调用 bringToFront()。