Murat Sahin
Murat Sahin

Reputation: 191

UIButton addTarget Selector is not working

SquareBox.swift

class SquareBox {
  func createBoxes() {
    for _ in 0..<xy {
            let button = UIButton()

            button.backgroundColor = .white
            button.setTitleColor(UIColor.black, for: .normal)
            button.layer.borderWidth = 0.5
            button.layer.borderColor = UIColor.black.cgColor
            stack.addArrangedSubview(button)
            button.addTarget(self, action: #selector(click(sender:)) , for: .touchUpInside)
    }
  }

  @objc func click(sender : UIButton) {
    print("Click")
  }
}

ViewController.swift

class GameViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let boxRow = SquareBox() 
        boxRow.createBoxes()
    }
}

Also I've tried @IBAction instead of @objc, it doesn't work, but if I use "click" function in ViewController.swift that I created this object, it's working but I need this function inside of this class.

Upvotes: 15

Views: 25788

Answers (7)

Faruk
Faruk

Reputation: 2449

For those who did not find a solution, here is mine.

If you constructed your UIButton as

let button: UIButton = {
  return UIButton()
}()

Just convert those into

lazy var button: UIButton = {
  return UIButton()
}()

I think this is because of somewhat deallocation as mentioned above.

Upvotes: 8

rmaddy
rmaddy

Reputation: 318954

Now that you have posted relevant information in your question, the problem is quite clear. You have a memory management issue.

In your GameViewController's viewDidLoad you create a local instance of SquareBox. This local instance goes out of scope at the end of viewDidLoad. Since there is no other reference to this instance, it gets deallocated at the end of viewDidLoad.

Since the instance of SquareBox has been deallocated, it is not around to act as the button's target. And your click method is never called.

The solution is to keep a reference in your view controller:

class GameViewController: UIViewController {
    let boxRow = SquareBox() 

    override func viewDidLoad() {
        super.viewDidLoad()
        boxRow.createBoxes()
    }
}

Upvotes: 22

Amul4608
Amul4608

Reputation: 1448

 var btnfirst:UIButton!
 override func viewDidLoad() 
 {
    super.viewDidLoad()
    btnfirst = UIButton(type: .system)
    btnfirst.setTitle("Press", for: .normal)
    btnfirst.setTitleColor(.red, for: .normal)
    btnfirst.frame = CGRect(x: 100, y: 200, width: 100, height: 30)
    btnfirst.addTarget(self, action: #selector(benpress( sender:)),for: .touchUpInside)
    self.view.addSubview(btnfirst)
}

func benpress( sender :UIButton) 
{
  //Your Code Here                       
}

Upvotes: 7

Puneet Sharma
Puneet Sharma

Reputation: 9484

I guess the issue is how you are setting up layout of your buttons. Try this:

func createBoxes() {
    stack.backgroundColor = UIColor.red
    for _ in 0..<xy {
        // Create the button
        let button = UIButton()
        button.backgroundColor = UIColor.red

        // Add constraints
        button.translatesAutoresizingMaskIntoConstraints = false
        button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
        button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true

        // Setup the button action
        button.addTarget(self, action: #selector(SquareBox.click(sender:)), for: .touchUpInside)

        // Add the button to the stack
        stack.addArrangedSubview(button)
    }
}

@objc func click(sender : UIButton) {
    print("Click")
}

Upvotes: 0

KKRocks
KKRocks

Reputation: 8322

Replace with this :

    btn.addTarget(self, action: #selector(self.click(sender:)), for: .touchUpInside)

enter image description here

I think something else effect to your selector method try to find in your code because your code also working in my project.

enter image description here

Upvotes: -2

emraz
emraz

Reputation: 1613

button.addTarget(self, action:#selector(self.click), for: .touchUpInside)

func click(sender : UIButton) {
       // code here
    }

Upvotes: 0

Lalit kumar
Lalit kumar

Reputation: 2207

button.addTarget(self, action: #selector(self.buttonTapped), for: .touchUpInside)

func buttonTapped(sender : UIButton) {
       // code here
    }

Upvotes: -1

Related Questions