簡體   English   中英

菜單項在macOS菜單欄App中禁用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM