Swift 3 迁移后不会调用 CollectionViewDelegate 方法
Posted
技术标签:
【中文标题】Swift 3 迁移后不会调用 CollectionViewDelegate 方法【英文标题】:CollectionViewDelegate method doesn't get called after Swift 3 migration 【发布时间】:2016-10-12 17:31:57 【问题描述】:我的应用程序中有一个简单的集合视图,我使用委托在点击单元格时获得通知,因此我实现了 didSelectItemAtIndexPath: 方法。在 Swift 2 中,这个方法的签名是这样的:
@objc func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
通过迁移过程运行后,此签名更改为:
@objc func collectionView(collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
编译器很高兴,我继续前进,但现在当我点击任何单元格时不会触发此方法。我找到了解决方法:
@objc(collectionView:didSelectItemAtIndexPath:) func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
显然,问题出在第一个参数名称上,但我仍然不明白为什么不明确指定 obj-c 选择器就无法工作。
【问题讨论】:
【参考方案1】:不用写@objc,
这是一个工作代码,
extension YourViewController:UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
print("didSelect")
【讨论】:
我的实现也在扩展中,但协议一致性在视图控制器声明中。编译器给了我这样的错误“Objective-C 方法 'collectionView:didSelectItemAt:' 由方法 'collectionView(_:didSelectItemAt:)' 提供的方法与需求的选择器 ('collectionView:didSelectItemAtIndexPath:') 不匹配”。当我将协议一致性转移到扩展时,一切都像魅力一样。仍然不太明白这里出了什么问题,我想我需要阅读更多关于 swift 和 obj-c 互操作性的信息。 Zaid 如果我们将代码移动到扩展,为什么它不需要@objc? @Ishika 扩展仅用于查看目的。 OP 代码的主要问题是,他的方法声明格式错误。 好的..谢谢 Zaid【参考方案2】:在 viewdidload 中添加委托,同时在情节提要中添加 uicollectionviewdelegae,uicollectionviewdatasource,
这对我有帮助。
【讨论】:
以上是关于Swift 3 迁移后不会调用 CollectionViewDelegate 方法的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)
迁移到 Swift 3 时,Facebook 登录不会返回应用程序