[英]menu items disabled in macOS menubar App
我正在嘗試在macOS上構建一個菜單欄應用程序。
我似乎無法弄清楚為什么一些菜單項被禁用...截圖:
如您所見, Quit菜單項已啟用,並在單擊時退出應用程序。 但是, “首選項”項已禁用。
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
類不是響應者鏈的一部分。 (類通常不能。某些對象可以。)因此,菜單項永遠不會以您的類為目標。
Quit菜單有效,因為應用程序對象位於響應程序鏈上,並且它具有terminate(_:)
方法。 實際上,這就是你的terminate(_:)
方法在被調用時會調用的內容。 但菜單項實際上是直接調用它。
您應該創建一個實際的控制器對象(不僅僅是類)來實現操作方法,並將菜單項的target
屬性設置為它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.