Swift TouchUpInside 上的 addTarget 错误

Swift addTarget Error on TouchUpInside

我在视图上添加了一个按钮,并使用 addTarget 绑定事件来调用 self.testp,但是当我 运行 它时,发生了一个错误:

2015-06-19 23:08:29.237 UI[16978:1700826] -[UI.ViewController testp:]: unrecognized selector sent to instance 0x7864d4a0
2015-06-19 23:08:29.240 UI[16978:1700826] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UI.ViewController testp:]: unrecognized selector sent to instance 0x7864d4a0'

密码是:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    var btn:UIButton = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton
    btn.frame = CGRectMake(10, 150, 100, 30)
    btn.setTitle("button", forState: UIControlState.Normal)

    //!!!!!!DID NOT WORK
    btn.addTarget(self, action: Selector("testp:"), forControlEvents: UIControlEvents.TouchUpInside);

    self.view.addSubview(btn)

    func testp(){
        println("tttt")
    }
}
}

为什么?!!

只需从您的选择器中删除 :,您的代码将是:

btn.addTarget(self, action: Selector("testp"), forControlEvents: UIControlEvents.TouchUpInside)

并将您的函数放在 viewDidLoad 方法之外,但放在 ViewController class.

如果您的函数具有如下所示的参数,则可以使用 "testp:"

func testp(yourArgument: String){
    println("tttt")
}

最后,我弄明白了

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var btn:UIButton = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton
        btn.frame = CGRectMake(10, 150, 100, 30)
        btn.setTitle("button", forState: UIControlState.Normal)

        //!!!!!!remove ":" for testp
        //btn.addTarget(self, action: Selector("testp:"), forControlEvents: UIControlEvents.TouchUpInside);
        btn.addTarget(self, action: Selector("testp"), forControlEvents: UIControlEvents.TouchUpInside);

        self.view.addSubview(btn)
        //I should put testp out of viewDidLoad
        //I should put testup UIViewController
        //func testp(){
        //    println("tttt")
        //}
    }

    // put testp here it's work
    func testp(){
        println("tttt")
    }
}