[英]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
相匹配。
有两种选择:
将addActivityToSpecificDay
移到任何类section
中(出于说明目的,假设它是SectionClass
),并在#selector
引用该类:
headerAddButton.addTarget(section, action: #selector(SectionClass.addActivityToSpecificDay(sender:)), for: .touchDown)
或保持addActivityToSpecificDay
在当前类,但目标改变addTarget
到self
:
headerAddButton.addTarget(self, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown)
你问:
重做选择器语法不再是字符串的意义何在?
它可以验证选择器的功能是否存在并且结构是否正确(这是一件非常好的事情),但是显然无法验证选择器的类是否与某些其他参数(在此示例中为target
)属于同一类。 编译器无法可靠地知道addTarget
方法如何使用选择器,也无法确定两个参数之间是否存在某些特殊关系。 这留给开发人员。 #selector
语法会#selector
帮助,但这不是灵丹妙药。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.