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 登录不会返回应用程序

swift 3 迁移后 NSPredicate 崩溃

Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟

Swift 集合视图不会添加超过 6 个项目?

从Swift 3.2迁移到Swift 4我使用autosavesInPlace收到错误