在StackOverflow上有很多教程/问题/答案,都是关于如何用一个简单的程序启动一个GUI应用程序,而不需要创建一个app bundle和Info. plist。其中大多数使用Objective-C方法[NSApp activateIgnoringOtherApps:true]
将应用程序带到前台,沿着使用[NSWindow makeKeyAndOrderFront:]
将窗口带到前台。
问题似乎是在macOS 10.15版本上,菜单栏直到你第一次从应用程序切换回来才启用。我已经设法将问题减少到Swift的以下几行:
// Run this, click on the Apple logo in the top left
// You cannot get the Apple system menu until you tab
// to another application and back again
import AppKit
var app = NSApplication.shared
app.setActivationPolicy(.regular)
app.activate(ignoringOtherApps: true)
app.run()
当这个作为命令行应用程序运行时,左上角的苹果菜单不能选择,如果你从那个应用程序切换,然后再切换回来,它就能工作了。
添加窗口和做makeKeyAndOrderFront
没有效果;你可以把它们加进去,窗口也会得到焦点--但是菜单栏不会被启用,直到你切换离开/回来。
同样令人困惑的是,如果你创建一个目录Example.app/Contents/MacOS
,然后复制上面的二进制文件,并使用open
启动应用程序,那么菜单从第一次启动时就可以正常工作。区别似乎是应用程序从终端和LaunchServices启动的方式。
有没有什么方法可以修复这个最小的例子,使菜单立即工作?
为了便于复制,我已经将代码推到https://github.com/alblue/Bugger,并且有一个makefile将执行构建并从命令行(make run
)和应用程序包(make app
)运行它。
2条答案
按热度按时间rt4zxlrg1#
我设法找到了一个简单的解决办法;将activate移动到
applicationDidFinishLaunching
委托中:在此更改后,菜单是可单击的。
对于10.15,对
setActivationPolicy
的调用也需要在applicationDidFinishLaunching
回调中。gg0vcinb2#
我也遇到了同样的问题。我切换了这些线,然后菜单栏就像预期的那样工作了!
出发地:
收件人: