繁体   English   中英

UnrecognizedSelector在Xcode9 / Swift4中怎么可能?

[英]How is UnrecognizedSelector even possible in Xcode9/Swift4?

代码完成会在#selector(内的方法名称中填写该名称,然后在运行时因无法识别选择器的错误(IllegalArgumentException)而崩溃。

重做选择器语法不再是字符串的意义何在?

这是选择器的创建:

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)

该部分(在此引用)是表视图的标题部分(忘了,此代码在Xcode 9之前有效):

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

这是处理程序的方法签名:

@objc func addActivityToSpecificDay (sender :UIButton)

当然在同一源文件中。 但是请阅读问题:如果代码补全可以找到它,那么我怎么会发生运行时崩溃?

您正在像这样添加目标:

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)

因为您的#selector没有使addActivityToSpecificDay符合条件,所以它显然与当前类中该名称的方法匹配,而不是与任何类section相匹配。

有两种选择:

  1. addActivityToSpecificDay移到任何类section中(出于说明目的,假设它是SectionClass ),并在#selector引用该类:

     headerAddButton.addTarget(section, action: #selector(SectionClass.addActivityToSpecificDay(sender:)), for: .touchDown) 
  2. 或保持addActivityToSpecificDay在当前类,但目标改变addTargetself

     headerAddButton.addTarget(self, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 

你问:

重做选择器语法不再是字符串的意义何在?

它可以验证选择器的功能是否存在并且结构是否正确(这是一件非常好的事情),但是显然无法验证选择器的类是否与某些其他参数(在此示例中为target )属于同一类。 编译器无法可靠地知道addTarget方法如何使用选择器,也无法确定两个参数之间是否存在某些特殊关系。 这留给开发人员。 #selector语法会#selector帮助,但这不是灵丹妙药。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM