Xcode 8/Swift 3:didSelectRowAt vs didSelectRowAtIndexPath

问题描述:

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

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

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

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

任何帮助表示赞赏。 谢谢。

+0

你怎么把'''didSelectRowAtIndexPath'''斯威夫特3?它在Swift 3中被删除。你只能使用'''didSelectRowAt'''? – 2016-09-26 12:34:07

+0

这是声明就像在Swift 2.2中,它编译得很好。 – Cosmin

+0

我有一些类似的问题与一些collectionView委托功能。虽然一切都很好,但没有成功。在注释掉非工作函数并通过XCode自动完成重新添加函数之后,它工作得很好 - 仅仅提到这两个函数之间没有错字错误.....我只是将我的代码从旧函数复制并粘贴到新的和瞧...也许它有帮助 –

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

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

在3.0之前的Swift版本中,底层的objective-c函数签名匹配了Swift UITableViewDelegate和UITableViewDataSource协议中的签名。因此,在3.0之前,使超类采用这些协议似乎工作得很好。但是从Swift 3.0开始,这些签名不再是匹配的。似乎要将新样式签名正确映射到底层的objective-c签名,您的类必须直接采用UITableViewDelegate和UITableViewDataSource协议。

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

为雨燕3.0,使用

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

    //your code... 


}