我正在尝试在macOS上构建菜单栏应用程序。
我似乎无法弄清楚为什么禁用了某些菜单项...屏幕截图:
如您所见,“退出”菜单项已启用,单击后退出应用程序。但是,“首选项”项被禁用。
AppDelegate.swift:
let menuBarItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
func applicationDidFinishLaunching(_ aNotification: Notification) {
menuBarItem.button?.image = NSImage(named: "MenuBarIcon")
menuBarItem.menu = MenuBarMenu()
}
MenuBarMenu.swift:
class MenuBarMenu: NSMenu {
init() {
super.init(title: "Menu")
self.addItem(withTitle: "Preferences...", action: #selector(MenuBarActions.openPreferencesWindow(_:)), keyEquivalent: "")
self.addItem(NSMenuItem.separator())
self.addItem(withTitle: "Quit", action: #selector(MenuBarActions.terminate(_:)), keyEquivalent: "")
}
required init(coder decoder: NSCoder) {
fatalError("init(coder:) has not been impemented")
}
}
class MenuBarActions {
@objc static func terminate(_ sender: NSMenuItem) {
NSApp.terminate(sender)
}
@objc static func openPreferencesWindow(_ sender: NSMenuItem) {
print("preferences")
}
}
我使用完全相同的方法来创建MenuBarItems和用于选择器的相同结构,因此这种不一致让我有些困惑。发生这种情况的原因是什么?如何解决此问题?
您的退出菜单项正在“意外”工作。它没有使用terminate(_:)
您实现的方法。在这里放一个print()
语句,您会看到它没有被调用。
菜单项要么分配了特定的目标对象,要么使用响应者链搜索适当的目标。您没有为菜单项分配目标,因此它们正在使用响应者链。您的MenuBarActions
课程不属于响应者链。(类通常不能。某些对象可以。)因此,菜单项永远不会以您的类为目标。
退出菜单之所以起作用,是因为应用程序对象位于响应者链上,并且具有terminate(_:)
方法。实际上,这就是您的terminate(_:)
方法曾经被调用过的情况。但是菜单项实际上是直接调用它。
您应该创建一个实际的控制器对象(不仅仅是类)来实现操作方法,并target
为其设置菜单项的属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句