【问题标题】:Swift: unrecognized selector sent to instanceSwift:发送到实例的无法识别的选择器
【发布时间】:2015-09-29 12:19:21
【问题描述】:

为什么这不起作用:

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

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

    }

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

  func backButtonPressed(sender:UIButton) {

    }

【问题讨论】:

  • 实际为我工作,无需任何修改。
  • 我尝试了这两个功能,但它们都崩溃了。消息:-[MyApp.HeaderView backButtonPressed:]: unrecognized selector sent to instance 0x7f9bd8432c70

标签: ios swift


【解决方案1】:

如果我没记错的话,您已经在另一个方法中声明了您的 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")
}

【讨论】:

  • 啊,谢谢.. 不小心在另一个方法里面添加了方法
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    替换您的操作参数 - 选择器,如:

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

    自 Swift 3 起,选择器语法已更改,如下所示。

    在选择器名称中使用字符串字面量很容易出错:甚至无法检查字符串是否是格式良好的选择器,更不用说它是否引用任何已知方法或预期的方法班级。 此外,为了执行 Objective-C API 的自动重命名,Swift 名称和 Objective-C 选择器之间的联系并不明显。通过基于方法的 Swift 名称提供显式的“创建选择器”语法,我们无需开发人员推理正在使用的实际 Objective-C 选择器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多