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的主要内容,如果未能解决你的问题,请参考以下文章
SDWebImage 库在 swift 3 Xcode 8.0 中出现错误
Swift 3、Xcode 8 中的 UINavigationController
Xcode 8 / Swift 3 - 类型“CGColorRenderingIntent”没有成员“RenderingIntentDefault”