【问题标题】:OS X Menubar application: How to bring window to frontOS X 菜单栏应用程序:如何将窗口置于前面
【发布时间】:2015-06-02 09:50:41
【问题描述】:

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

应用设置

“仅菜单栏应用”是指:

  • 我从主情节提要文件的NSWindowController 中删除了“是初始控制器”。我的应用中没有使用主情节提要的窗口
  • 我在主情节提要的“应用场景”中添加了一个NSMenu。这将成为我的菜单栏菜单
  • 我将LSUIElement 设置为YES 以隐藏停靠图标
  • 我将LSBackgroundOnly 设置为NO(见NSWindow makeKeyAndOrderFront makes window appear, but not Key or Front

当应用程序启动时,我创建了一个NSStatusItem 并将情节提要中的NSMenu 添加为其菜单。这一切都很好 - 应用程序启动,没有显示窗口和停靠图标,而是一个包含故事板菜单的菜单栏项。

设置窗口

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

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

当单击菜单中的“设置”条目时,我尝试使用以下命令将设置窗口置于前面:

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

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

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

【问题讨论】:

    标签: objective-c xcode macos window nswindowcontroller


    【解决方案1】:

    您需要致电:

    [NSApp activateIgnoringOtherApps:YES];
    

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

    对于 Swift,你可以使用

    NSApp.activate(ignoringOtherApps: true)
    

    【讨论】:

    • 当然!你就是那个人,谢谢你,这绝对有效。
    • 在基于文档的应用程序中,通过这种精确设置,如何强制应用程序显示其菜单?窗口正确显示,但没有菜单。来回切换应用程序可使菜单正确显示。
    【解决方案2】:

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

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

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

    然后,只要您想提出它,就调用bringToFront()。

    【讨论】:

    • 谢谢!只需将NSApp.activate(ignoringOtherApps: true) 放在我准备转场功能中对我来说效果很好。从 windowDidLoad 调用 bringToFront() 没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多