Xcode 8 / Swift 3:didSelectRowAt 与 didSelectRowAtIndexPath

Posted

技术标签:

【中文标题】Xcode 8 / Swift 3:didSelectRowAt 与 didSelectRowAtIndexPath【英文标题】:Xcode 8 / Swift 3: didSelectRowAt vs didSelectRowAtIndexPath 【发布时间】:2016-09-26 11:11:40 【问题描述】:

在我们的 Swift 3 迁移之后发生了一些非常奇怪的事情。 我们有两个视图控制器,它们都实现了UITableViewDelegate,它们都实现了public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

但是只有其中一个调用了实际的方法。

如果我将不起作用的 public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 更改为 public func tableView(_ tableView: UITableView, didSelectRowAtIndexPath: IndexPath)(注意 Swift 2.2 签名),那么它们都可以工作。

两个视图控制器都是 Swift 类,所以我不确定到底发生了什么。 我很确定这可能是 Objective-C 与 Swift 的互操作性问题,但我们的整个项目都是用 Swift 编写的,所以很难弄清楚是什么原因造成的。

感谢任何帮助。 谢谢。

【问题讨论】:

你是如何将didSelectRowAtIndexPath 放入 Swift 3 的?它在 Swift 3 中被删除。你只能使用didSelectRowAt ? 它的声明就像在 Swift 2.2 中一样,并且编译得很好。 我在一些 collectionView 委托函数中遇到了类似的问题。虽然一切都很好,但他们没有工作。在注释掉非工作函数并通过 XCode 自动完成再次添加函数后,它工作得很好 - 只是提到两个函数之间没有拼写错误.....我只是将我的代码从旧函数复制并粘贴到新的,瞧……也许有帮助 【参考方案1】:

对于 Swift 3.0,使用

override  func tableView(_ tableView: UITableView, didSelectRowAt
 indexPath: IndexPath)

  //your code...  


 

【讨论】:

【参考方案2】:

我遇到了类似的问题。我的问题是由于有一个采用 UITableViewDelegate 和 UITableViewDataSource 协议的超类,然后在子类中实现了实际方法。

我收集到的是,因为 UITableViewDelegate 和 UITableViewDataSource 是 Objective-C 协议,所以它们必须被实现这些功能的类直接采用。否则 Swift 函数签名将无法正确映射到 Objective-c 函数签名(不知道为什么会这样)。

在 Swift 3.0 之前的版本中,底层的 Objective-C 函数签名与 Swift UITableViewDelegate 和 UITableViewDataSource 协议中的签名相匹配。因此,在 3.0 之前,让超类采用这些协议似乎工作得很好。然而,从 Swift 3.0 开始,这些签名不再匹配。看来要让新式签名正确映射到底层的 Objective-C 签名,您的类必须直接采用 UITableViewDelegate 和 UITableViewDataSource 协议。

因此,在 Swift 3.0 及更高版本中,如果您不直接采用 UITableViewDelegate 和 UITableViewDataSource 协议,那么您的函数签名必须匹配旧式底层 Objective-c 签名才能正确调用您的函数。

【讨论】:

以上是关于Xcode 8 / Swift 3:didSelectRowAt 与 didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 3 xcode 8 中出现错误

SDWebImage 库在 swift 3 Xcode 8.0 中出现错误

Swift 3、Xcode 8 中的 UINavigationController

Xcode 8 / Swift 3 - 类型“CGColorRenderingIntent”没有成员“RenderingIntentDefault”

Xcode 8.3 不支持 Swift 2.3 [关闭]

Xcode 8 - Swift 3 - 破坏我的应用程序