Dan*_*iel 9 macos cocoa menubar background-process swift
我有一个状态栏应用程序,它在菜单栏中运行.因此,我设置Application is agent (UIElement)
到true
的info.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.plst
to中的值false
并使用NSApp.setActivationPolicy(.accessory)
in applicationDidFinishLaunching()
,则它具有相同的结果.但是,如果我在调用NSApp.setActivationPolicy(.accessory)
后几毫秒调用一个计时器applicationDidFinishLaunching()
,它就可以工作,并且主菜单正在按预期显示.然而,这有副作用,即应用程序图标在停靠栏中弹出几秒钟(直到计时器被触发),这不是一个很好的用户体验.
有谁知道我还能尝试什么?切换活动应用时发生了什么,我在代码中没做什么?
我在macOS 10.12.2(16C67)上使用版本8.2.1(8C1002)
谢谢!
这是我现在的解决方法:
正如我在问题中所写,如果我单击另一个应用程序并返回到我的应用程序,则会显示菜单栏。当我尝试显示首选项窗口时,我正在模拟这一点:
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)
这不是一个完美的解决方案。如果我找不到更好的解决方案,我将提交一个错误。