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

Xcode 8 drag and connect @IBAction incorrectly adds "WithSender" on connection inspector IB

Xcode 8 拖动并连接 @IBAction 错误地在连接检查器 IB

上添加了 "WithSender"

因此我必须将这些方法重命名为

@IBAction func tappedConfirmButtonWithSender(sender: AnyObject) {}

不应该吗?:

@IBAction func tappedConfirmButton(sender: AnyObject) {}

这是我的错还是错误?

我也刚打了这个。它似乎是遗留 Swift 2.3 代码的错误,因为有一点 Swift 3 泄漏。我找到了关键答案 in the dev forums,加上我和我的同事的一些额外发现.

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

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

发生了什么事: Xcode 8 个故事板中似乎存在错误。我的解释是它错误地将 Swift 2 @IBAction 方法解析为 Swift 3,然后尝试将它们转换回 Swift 2.

让我们详细了解一下!在 Swift 3 中,与 Swift 2 不同,给定一个方法声明为:

@IBAction func foo(sender: AnyObject)

sender 参数标签实际上是方法名称的一部分,并包含在对该方法的调用中。在 Swift2 中,当然,第一个参数默认没有标签。在 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 称。)

[反复编辑并更改变通办法。]

我终于找到了我遇到的问题的主题。我开始怀疑自己了

我会为有兴趣的人提出另一种解决方法。

右键单击打开故事板 -> 打开为 -> 源代码。

在 xml 文件中找到您的方法并删除 WithSender 附加项以使您的方法名称与 class 中的方法名称相匹配。

这样您就可以按照自己的方式命名方法。

就是这样...

我在使用 Xcode 8 时遇到了同样的问题。It may be bug.

以下是解决此问题的方法:

  1. Delete the outlet connection 来自 IB 文件

  2. 创建一个 new outlet 按 Ctrl 并拖动。这将打开一个弹出窗口,如下所示。

Select 连接为 Action 并输入 name of action。然后 select Type.

  1. Connect。这将在您的 Swift 文件中创建新的 IBAction。 虽然IBAction的圈可能没有被填满,但它是相连的。

您可以尝试修改如下:

@IBAction func tappedConfirmButton(_ sender: AnyObject) 
{

}

祝你好运!