如何防止Mac菜单栏应用失去焦点?

时间:2019-07-07 04:37:49

标签: swift macos interface-builder nswindow nswindowcontroller

我正在制作适用于macOS的菜单栏应用程序。有时应用程序需要向用户展示一个窗口,而我目前正在使用它

var windowController : NSWindowController!

let mainStoryBoard = NSStoryboard(name: NSStoryboard.Name("StoryboardName"), bundle: nil)
windowController = mainStoryBoard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("WindowID")) as! NSWindowController
windowController.showWindow(self)

我也正在激活该应用程序,而忽略所有其他应用程序,并使用window键和main键。效果很好,但是我的问题是,一旦我离开窗口(例如通过打开任务控制或切换到其他空间)并返回窗口(通过关闭任务控制或返回初始空间),我的应用不再聚焦,我的窗户向后退,无论我背后的哪个应用现在都处于活动状态。

因此,如果我的应用程序窗口位于Safari窗口顶部,然后切换到另一个空间,然后返回,则我的应用程序现在“丢失”在Safari窗口后面,并且Safari处于活动状态。我尝试删除“仅背景应用程序” info.plist键,以便该应用程序具有停靠图标,并且问题仍然存在。我究竟做错了什么?以及如何使我的窗户像普通窗户一样运转?救命!谢谢。

1 个答案:

答案 0 :(得分:0)

我无法复制您描述的行为。无论我离开窗户,我的窗户都会停下来。您是这样使窗口成为AppDelegate的属性吗?

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate
{
    let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)

    var prefsWindow: NSWindow?

    func showMyWindow() // called from menu item
    {
        if prefsWindow == nil
        {
            let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
            let controllerId = NSStoryboard.SceneIdentifier("myWindow")
            guard let controller = storyboard.instantiateController(withIdentifier: controllerId) as? NSWindowController else { return }
            guard let window = controller.window else { return }

            window.delegate = self
            window.center()
            prefsWindow = window
        }

        prefsWindow?.makeKeyAndOrderFront(self)
        NSApp.activate(ignoringOtherApps: true)
    }

    func windowWillClose(_ notification: Notification)
    {
        prefsWindow = nil
    }
    ...
相关问题