Swift:发送到实例的无法识别的选择器

时间:2015-09-29 12:19:22

标签: ios swift

为什么这不起作用:

    self.backButton?.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: .TouchUpInside)

   // unrecognized selector sent to instance CRASH
    func backButtonPressed(sender:AnyObject?) {

    }

此崩溃(无法识别的选择器发送到实例)

  func backButtonPressed(sender:UIButton) {

    }

3 个答案:

答案 0 :(得分:6)

如果我没有错,你已经在另一个方法中声明了你的backButtonPressed方法:

override func viewDidLoad() {
    super.viewDidLoad()

    let button = UIButton(frame: CGRectMake(150, 240, 75, 30))
    button.setTitle("Next", forState: UIControlState.Normal)
    button.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: UIControlEvents.TouchUpInside)
    button.backgroundColor = UIColor.greenColor()
    self.view.addSubview(button)

    func backButtonPressed(sender:AnyObject?) {

        print("Called")
    }
    // Do any additional setup after loading the view, typically from a nib.
}

这是错误的方式。

在外面声明您的方法,如下面的代码所示:

override func viewDidLoad() {
    super.viewDidLoad()

    let button = UIButton(frame: CGRectMake(150, 240, 75, 30))
    button.setTitle("Next", forState: UIControlState.Normal)
    button.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: UIControlEvents.TouchUpInside)
    button.backgroundColor = UIColor.greenColor()
    self.view.addSubview(button)
}

func backButtonPressed(sender:AnyObject?) {

    print("Called")
}

答案 1 :(得分:1)

在swift上你不再需要写选择器了

self.backButton?.addTarget(self, action: "backButtonPressed:", forControlEvents: .TouchUpInside)

答案 2 :(得分:0)

替换你的动作参数 - 选择器如:

self.backButton?.addTarget(self, action: #selector(self. backButtonPressed(sender:)), for:. touchUpInside)
  

Swift 3 以来,选择器语法已更改,如此处所示。   

使用字符串文字作为选择器名称容易出错:没有检查字符串是否是一个格式良好的选择器,更不用说它指的是任何已知的方法,或者是一种方法。预期的课程。   此外,通过努力执行Objective-C API的自动重命名,Swift名称和Objective-C选择器之间的链接是不明显的。通过提供明确的"创建一个选择器"基于方法的Swift名称的语法,我们不需要开发人员推断使用的实际Objective-C选择器。