我已经看到了,这是一个常见的问题,但我找不到任何解决方案。
以下是代码:
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
}
}
问题: 出现红色按钮但是当我点击它时,我得到“无法识别的选择器发送到课堂”错误。
任何帮助表示赞赏!感谢。
答案 0 :(得分:6)
您将无法识别的选择器发送到班级,因为您设置了错误的目标。
目标应该是self
而不是ButtonViewController.self
:
but.addTarget(self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)
您的#selector
有效,但对于Swift 3,您应该将操作编写为func exmp(_ sender: UIButton) {
,使选择器#selector(exmp(_:))
成为可能。注意:无论您是否重写exmp
,都可以将选择器简化为#selector(exmp)
。
答案 1 :(得分:0)
所以我一直在寻找这个问题2天。正确的addTarget方法必须如下:
but.addTarget(self, action: #selector(ButtonViewController.exmp(sender:)), for: .touchDown)
但是还有一个问题对我来说是“由于信号导致命令失败:分段错误:11”。
当我尝试在viewDidLoad()方法中创建我的按钮时,没有错误。所以我认为这可能与创建或不创建按钮的位置有关。我在创建按钮时输入 lazy var 而不是让。
不过,作为初学者,我真的不知道“layz var”是什么。我只知道这会导致我的按钮被创建,只有当它被调用时。 如果有人在这里启发我和其他初学者关于懒惰的变种,那就太好了。感谢。
最终解决方案
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
}()