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.
You are getting Unrecognized selector sent to class because you have set the wrong target. The target should be
self
and notButtonViewController.self
:Your
#selector
works, but for Swift 3 you should write the action asfunc exmp(_ sender: UIButton) {
making the selector#selector(exmp(_:))
. Note: whether or not you rewriteexmp
, you can simplify the selector to just#selector(exmp)
.So i've been looking around for this issue for 2 days. The right addTarget method must be like this:
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