【发布时间】:2016-12-27 06:24:48
【问题描述】:
我有一个状态栏应用程序,它在菜单栏中运行。因此我在info.plst 中将Application is agent (UIElement) 设置为true。这导致我的应用程序没有停靠图标和菜单栏。
但是,我还有一个用户可以从状态栏菜单打开的首选项窗口。这是我打开它的方式:
if (!NSApp.setActivationPolicy(.regular)) {
print("unable to set regular activation policy")
}
NSApp.activate(ignoringOtherApps: true)
if let window = preferencesWindowController.window {
window.makeKeyAndOrderFront(nil)
}
窗口按预期显示,但应用程序的主菜单栏与 File、Edit 等没有显示。只有当我点击另一个应用程序并返回我的应用程序时,才会显示菜单栏。
我注意到,如果我将info.plst 中的值更改为false 并在applicationDidFinishLaunching() 中使用NSApp.setActivationPolicy(.accessory),则结果相同。但是,如果我在调用applicationDidFinishLaunching() 几毫秒后使用计时器调用NSApp.setActivationPolicy(.accessory),它会正常工作并且主菜单会按预期显示。但是,这会产生副作用,即应用程序图标会在 Dock 中弹出几秒钟(直到计时器被触发),这不是一个好的用户体验。
有人知道我还能尝试什么吗?当我切换活动的应用程序时发生了什么,我没有在代码中执行?
我在 macOS 10.12.2 (16C67) 上使用版本 8.2.1 (8C1002)
谢谢!
【问题讨论】:
-
“窗口按预期显示”我假设窗口也成为第一响应者,并且看起来不像在背景中或其他东西。对吗?
-
我的应用程序也遇到了这个问题。你并不孤单:)
标签: swift macos cocoa background-process menubar