Reputation: 196
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
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
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