Unal Celik
Unal Celik

Reputation: 196

Unrecognized selector sent to class

I've seen that, this is a common issue but i couldn't find any solution for myself.

Here is the code:

class ButtonViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(button)
    }

    func exmp(sender: UIButton) {
        print("hello world")
    }

    let button: UIButton = {
        let but = UIButton(frame: CGRect(x: 33, y: 33, width: 33, height: 33))
        but.setTitle("-", for: .normal)
        but.titleLabel?.textColor = UIColor.white
        but.layer.cornerRadius = 10
        but.backgroundColor = UIColor.red
        but.addTarget(ButtonViewController.self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)
        return but
    }
}

Issue: The red button appears but when i click it i get the "Unrecognized selector sent to class" error.

Any help is appreciated! Thanks.

Upvotes: 4

Views: 5330

Answers (2)

Unal Celik
Unal Celik

Reputation: 196

So i've been looking around for this issue for 2 days. The right addTarget method must be like this:

but.addTarget(self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)

But there was still one more problem for me which is "Command failed due to signal: Segmentation fault: 11".

When i tried to create my button in viewDidLoad() method there was no error. So i thought that may be something with where the button is created or not. And i put lazy var instead of let while creating my button.

Still, as a beginner i dont really know what "layz var" is. I just know that causes my button created, only when it's called. It'd be nice if someone enlightens me and other beginners around here about lazy vars. Thanks.

Final Solution

override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(button)
}

func exmp(sender: UIButton) {
    print("hello world")
}

lazy var button: UIButton = {
    let but = UIButton(frame: CGRect(x: 33, y: 33, width: 33, height: 33))
    but.setTitle("-", for: .normal)
    but.titleLabel?.textColor = UIColor.white
    but.layer.cornerRadius = 10
    but.backgroundColor = UIColor.red
    but.addTarget(self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)
    return but
}()

Upvotes: 0

vacawama
vacawama

Reputation: 154513

You are getting Unrecognized selector sent to class because you have set the wrong target. The target should be self and not ButtonViewController.self:

but.addTarget(self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)

Your #selector works, but for Swift 3 you should write the action as func exmp(_ sender: UIButton) { making the selector #selector(exmp(_:)). Note: whether or not you rewrite exmp, you can simplify the selector to just #selector(exmp).

Upvotes: 10

Related Questions