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编写的,所以很难弄清楚是什么导致了这个问题。
任何帮助表示赞赏。 谢谢。
我遇到过类似的问题。我的问题是由于有一个超类,它采用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...
}
你怎么把'''didSelectRowAtIndexPath'''斯威夫特3?它在Swift 3中被删除。你只能使用'''didSelectRowAt'''? – 2016-09-26 12:34:07
这是声明就像在Swift 2.2中,它编译得很好。 – Cosmin
我有一些类似的问题与一些collectionView委托功能。虽然一切都很好,但没有成功。在注释掉非工作函数并通过XCode自动完成重新添加函数之后,它工作得很好 - 仅仅提到这两个函数之间没有错字错误.....我只是将我的代码从旧函数复制并粘贴到新的和瞧...也许它有帮助 –