Search code examples
swiftcocoansmenuitem

Calling a function through #selector with parameters


I'm wanting to call a function and give it parameters using the #selector. However, I get the error:

"Argument of '#selector' does not refer to an '@objc' method, property, or initializer"

@objc func changeCrypto(crypto: String) {
    //stuff
}

func constructMenu() {
    let menu = NSMenu()

    menu.addItem(NSMenuItem(title: "Bitcoin", action: #selector(changeCrypto(crypto: "bitcoin")), keyEquivalent: "B"))
    menu.addItem(NSMenuItem(title: "Ethereum", action: #selector(changeCrypto(crypto: "ethereum")), keyEquivalent: "E"))
    menu.addItem(NSMenuItem(title: "Litecoin", action: #selector(changeCrypto(crypto: "litecoin")), keyEquivalent: "L"))
    menu.addItem(NSMenuItem.separator())
    menu.addItem(NSMenuItem(title: "Quit It", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))

    statusItem.menu = menu
}

Solution

  • I fixed it! I changed it to the following..

    @objc func changeCrypto(_ sender: NSMenuItem) {
    //Here I call the title of the Menu Item pressed
    print(sender.title)
    }
    
    func constructMenu() {
    let menu = NSMenu()
    
    menu.addItem(NSMenuItem(title: "Bitcoin", action: #selector(changeCrypto(_:)), keyEquivalent: "B"))
    menu.addItem(NSMenuItem(title: "Ethereum", action: #selector(changeCrypto(_:)), keyEquivalent: "E"))
    menu.addItem(NSMenuItem(title: "Litecoin", action: #selector(changeCrypto(_:)), keyEquivalent: "L"))
    menu.addItem(NSMenuItem.separator())
    menu.addItem(NSMenuItem(title: "Quit It", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
    
    statusItem.menu = menu
    }