Xcode 8拖动并连接@IBAction错误地在连接检查器IB上添加"WithSender"

moy*_*teg 15 ibaction xcode8

Xcode 8拖动并连接@IBAction错误地在连接检查器IB上添加"WithSender"

因此,我必须将方法重命名为类似的方法

@IBAction func tappedConfirmButtonWithSender(sender:AnyObject){}

不应该吗?:

@IBAction func tappedConfirmButton(sender:AnyObject){}

这是我的错还是这个错误?

rob*_*pie 31

我也打过这个.它似乎是传统Swift 2.3代码的一个错误,因为Swift 3泄漏了一些.我在开发论坛找到了关键答案,还有我和我的同事的一些额外发现.

解决方法:将参数更改(sender: AnyObject)(_ sender: AnyObject).您将在修改后的行上收到警告,您可以放心地忽略它.

[ 更新 - 另一种解决方法: Apple回应了我的错误报告并提出了一个不同的解决方法:使用注释@IBAction方法@objc.我还没有确认这是有效的.]

发生了什么:看起来Xcode 8故事板中有一个错误.我的解释是它错误地解析了Swift 2 @IBAction方法,好像它们是Swift 3,然后尝试将它们转换回Swift 2.

我们来详细一点!在Swift 3中,与Swift 2不同,给定一个声明为:

@IBAction func foo(sender: AnyObject)
Run Code Online (Sandbox Code Playgroud)

sender参数标签实际上是方法名称的一部分,被包含在调用该方法.当然,在Swift 2中,第一个参数默认不会获得标签.在Swift 2中,你会打电话foo(myButton); 在Swift 3中,你打电话foo(sender: myButton).

Xcode 8错误地读取了Swift 3方式的这个功能.并且API重命名的模式是Swift 2的方法名称doSomethingWithParam(quuz)被重写为Swift 3 doSomething(param: quuz).Xcode假设这是发生在这里的事情,因此在误导性地尝试派生原始的Swift 2名称时,它会添加WithSender回方法名称的末尾.下划线解决方法的工作原理是使Swift 3方法签名与Swift 2签名相同.(@objc据Apple称,我不知道为什么注释也解决了这个问题.)

[反复修改变通办法.]

  • 感谢您的详细更新!我觉得这样的事情正在发生.我当前的**解决方法**是**连接@IBAction然后查看Interface Builder**上的实际插座(右键单击视图元素),它显示**黑色弹出窗口中选择器的字符串文字**所以我只需要**更新函数名称以匹配它.** (4认同)