macOS菜单栏应用程序:主菜单未显示

Dan*_*iel 9 macos cocoa menubar background-process swift

我有一个状态栏应用程序,它在菜单栏中运行.因此,我设置Application is agent (UIElement)trueinfo.plst.这导致我的应用程序没有停靠图标和菜单栏.

但是,我还有一个用户可以从状态栏菜单打开的首选项窗口.这是我打开它的方式:

if (!NSApp.setActivationPolicy(.regular)) {
    print("unable to set regular activation policy")
}
NSApp.activate(ignoringOtherApps: true)
if let window = preferencesWindowController.window {
    window.makeKeyAndOrderFront(nil)
}
Run Code Online (Sandbox Code Playgroud)

该窗口按预期显示,但应用程序的主菜单栏包含文件,编辑等,但未显示.只有当我点击另一个应用程序并返回我的应用程序时,才会显示菜单栏.

我注意到,如果我更改info.plstto中的值false并使用NSApp.setActivationPolicy(.accessory)in applicationDidFinishLaunching(),则它具有相同的结果.但是,如果我在调用NSApp.setActivationPolicy(.accessory)后几毫秒调用一个计时器applicationDidFinishLaunching(),它就可以工作,并且主菜单正在按预期显示.然而,这有副作用,即应用程序图标在停靠栏中弹出几秒钟(直到计时器被触发),这不是一个很好的用户体验.

有谁知道我还能尝试什么?切换活动应用时发生了什么,我在代码中没做什么?

我在macOS 10.12.2(16C67)上使用版本8.2.1(8C1002)

谢谢!

Dan*_*iel 6

这是我现在的解决方法

正如我在问题中所写,如果我单击另一个应用程序并返回到我的应用程序,则会显示菜单栏。当我尝试显示首选项窗口时,我正在模拟这一点:

    NSApp.setActivationPolicy(.regular)
    NSApp.activate(ignoringOtherApps: true)
    window.makeKeyAndOrderFront(nil)

   if (NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.dock").first?.activate(options: []))! {
       let deadlineTime = DispatchTime.now() + .milliseconds(200)
       DispatchQueue.main.asyncAfter(deadline: deadlineTime) {                 
       NSApp.setActivationPolicy(.regular)
            NSApp.activate(ignoringOtherApps: true)
       }
   }
Run Code Online (Sandbox Code Playgroud)

这不是一个完美的解决方案。如果我找不到更好的解决方案,我将提交一个错误。