Home > Software engineering >  NSStatusItem menu Action not firing
NSStatusItem menu Action not firing

Time:12-31

The NSStatusItem menu shows correctly but when I click on menu the action not fire.

Since the app is compatible with Mac Catalyst, I created framework then passing Framework to main app in order to show the menu of NSStatusItem, it work correctly but I have the issue for action of the menu that doesn't work.

Here is my code:

@objc class AppKitController: NSObject {
    var statusBarItem: StatusBarItemControler!

    override init() {
        super.init()
        
        print("[AppKitController] Loaded successfully")
        self.statusBarItem = StatusBarItemControler()
        self.statusBarItem.updateTitle()
        self.statusBarItem.updateMenu()
    }
}

class StatusBarItemControler {
    let item: NSStatusItem

    init() {
        self.item = NSStatusBar.system.statusItem(
            withLength: NSStatusItem.variableLength
        )
        let statusBarMenu = NSMenu(title: "APPMenu")
        self.item.menu = statusBarMenu
        
    }

    func updateTitle() {
        let title = "AppMenu"
        print("Update title")

        DispatchQueue.main.async {
            if let button = self.item.button {
                button.title = "\(title)"
                button.target = self
                
            }
        }
    }

    func updateMenu() {
        if let statusBarMenu = self.item.menu {
            statusBarMenu.autoenablesItems = false
            statusBarMenu.removeAllItems()
            
            statusBarMenu.addItem(NSMenuItem.separator())
            statusBarMenu.addItem(NSMenuItem.separator())
            self.createPreferencesSection()
        }
    }

    func createPreferencesSection() {
        self.item.menu!.addItem(
            withTitle: "Open",
            action: #selector(openPrefecencesWindow),
            keyEquivalent: ",")
        self.item.menu!.addItem(
            withTitle: "Quit",
            action: #selector(quit),
            keyEquivalent: "q")
    }
    
    
    @objc func openPrefecencesWindow(_: NSStatusBarButton?) {
        print("Open preferences window")
    
        }
    
    @objc func quit(_: NSStatusBarButton?) {
        print("Open preferences window")
        }

}

CodePudding user response:

Thank you @Alexander, I have found the solution and it works.

 class AppKitController: NSObject,NSApplicationDelegate,NSWindowDelegate {
 
     
     let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
     
     override init() {
         super.init()
         
         NSApplication.shared.delegate = self
         NSApplication.shared.mainWindow?.delegate = self
         statusItem.button?.title = "Your_App_Name"
         
         statusItem.menu = createMenu()
         print("[AppKitController] Loaded successfully")
       
     }
     
     func createMenu() -> NSMenu{
         let menu = NSMenu()
         let openMenuItem = menu.addItem(withTitle: "Open", action: #selector(openMenu), keyEquivalent: "")
         openMenuItem.target = self
         return menu
         
     }
 
     @objc func openMenu(_ sender:Any?){
         print("Open menu called")
         
     }
     func windowShouldClose(_ sender: NSWindow) -> Bool {
         print("Window should close")
         return false
     }
}
  • Related