Search code examples
swiftselectoruibarbuttonitem

UIBarButtonItem selector not working


I have a MainViewController embed in a Navigation Controller, as shown below:
enter image description here

And in MainViewController.swift, I added two UIBarButtonItem(left and right) programmatically:

class MainViewController: UIViewController {

    let rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
    let leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.rightBarButtonItem = rightButton
        navigationItem.leftBarButtonItem = leftButton
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @objc func onRightClick() {
        print("[Main] Right Click")
    }

    @objc func onLeftClick() {
        print("[Main] Left Click")
    }
}

The buttons did show on the screen, but the interesting thing is, the selector functions onLeftClick and onRightClick never get called whenever I pressed left or right button. Is there anything I should do to make it works? I am using Xcode 9.3.


Solution

  • try with inside scope once

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(self.onRightLeftClick(_ :)))
        rightButton.tag = 1
        let leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(self.onRightLeftClick(_ :)))
        rightButton.tag = 2
        self.navigationItem.rightBarButtonItem = rightButton
        self.navigationItem.leftBarButtonItem = leftButton
    }
    

    handle the action as

    func onRightLeftClick(_ sender: UIBarButtonItem){
        if sender.tag == 1{
            // rightButton action
        }else{
            // leftButton action
        }
    }