简体   繁体   English

单击/打开 NSStatusItem 时刷新 NSMenuItem

[英]refresh NSMenuItem on click/open of NSStatusItem

I have the following extension where I have a NSMenuItem with it's state being either on or off:我有以下扩展,其中我有一个 NSMenuItem,它的状态是打开或关闭:

extension AppDelegate {
    
    func createStatusBarItem() {
        let sBar = NSStatusBar.system
        
        // create status bar item in system status bar
        sBarItem = sBar.statusItem(withLength: NSStatusItem.squareLength)
        ...
        
        let sBarMenu = NSMenu(title: "Options")
        
        // assign menu to status bar item
        sBarItem.menu = sBarMenu
        
        let enableDisableMenuItem = NSMenuItem(title: "Enabled", action: #selector(toggleAdvancedMouseHandlingObjc), keyEquivalent: "e")
        enableDisableMenuItem.state = sHandler.isAdvancedMouseHandlingEnabled() ? NSControl.StateValue.on : NSControl.StateValue.off
        sBarMenu.addItem(enableDisableMenuItem)
        
        ...
    }
    
    @objc func toggleAdvancedMouseHandlingObjc() {
        if sHandler.isAdvancedMouseHandlingEnabled() {
            sHandler.disableAdvancedMouseHandling()
        } else {
            sHandler.enableAdvancedMouseHandling()
        }
    }
}

As soon as I want to change the state of the sHandler object I would also like to refer this change to the NSMenuItem and enable or disable the check mark depending on the state of NSHandler.只要我想更改 sHandler 对象的状态,我还想将此更改引用到 NSMenuItem 并根据 NSHandler 的状态启用或禁用复选标记。

However it looks like the menu is being built only at first launch.但是,看起来菜单仅在首次启动时才构建。 How do I re-trigger the menu item in order to show or not show the check mark?如何重新触发菜单项以显示或不显示复选标记?

Keep a reference to the created NSMenuItem in your app delegate and update its state (assuming you use the item only in a single menu).在您的应用程序委托中保留对创建的NSMenuItem的引用并更新其状态(假设您仅在单个菜单中使用该项目)。

class AppDelegate: NSApplicationDelegate {

    var fooMenuItem: NSMenuItem?

}

    func createStatusBarItem() {
        ...
        let enableDisableMenuItem = NSMenuItem(title: "Enabled", action: #selector(toggleAdvancedMouseHandlingObjc), keyEquivalent: "e")
        self.fooMenuItem = enableDisableMenuItem
        ...
    }

    @objc func toggleAdvancedMouseHandlingObjc() {
        if sHandler.isAdvancedMouseHandlingEnabled() {
            sHandler.disableAdvancedMouseHandling()
        } else {
            sHandler.enableAdvancedMouseHandling()
        }

        self.fooMenuItem.state = sHandler.isAdvancedMouseHandlingEnabled() ? NSControl.StateValue.on : NSControl.StateValue.off
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM