无法识别的选择器发送到类

时间:2017-01-02 14:55:43

标签: ios swift swift3

我已经看到了,这是一个常见的问题,但我找不到任何解决方案。

以下是代码:

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
    }
}

问题: 出现红色按钮但是当我点击它时,我得到“无法识别的选择器发送到课堂”错误。

任何帮助表示赞赏!感谢。

2 个答案:

答案 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
}()