Unrecognized selector sent to class

2019-07-30 15:02发布

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.

标签: ios swift swift3
2条回答
唯我独甜
2楼-- · 2019-07-30 15:47

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).

查看更多
走好不送
3楼-- · 2019-07-30 16:01

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
}()
查看更多
登录 后发表回答