collectionView didSelectItemAtIndexPath 在迁移到 Xcode 10.2 后停止工作

collectionView didSelectItemAtIndexPath stopped working after migrated to Xcode 10.2

在安装最新的 Mojave macOS 后,我刚刚将 Xcode 升级到版本 10.2。

Xcode 要求我将我的 Swift 从 3.0 迁移到更高版本,所以我选择更新到 Swift 5.0。

在对语法进行一些小改动后,该应用程序启动 运行。然而,我发现 collectionView didSelectItemAtIndexPath 在模拟器或设备中停止工作,这意味着当您点击 collectionView 中的项目时,将不再调用相应的 didSelectItemAtIndexPath 方法。

我多次检查我的代码更改,我很确定语法更改与受影响的 collectionView 无关。我可以使用一些 TagGesture 技巧来解决,但我想知道这里有什么问题。

我很确定集合视图允许用户交互,也允许选择。

这是怎么回事?

更新:

迁移后我的旧代码完全没有变化,看起来像这样:

func collectionView(_ collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: IndexPath) {
...
}

我根据回答者的建议更新为以下内容。但是,还是不行。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
...
}

(我连xib文件都没动,代表都是对的。)

委托方法可能已重命名。检查您是否正在实施:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

还要仔细检查您是否仍在将控制器设置为 UICollectionView 的委托。

查看此问答:

本质上,swift5 上存在一个错误,涉及由超类实现的协议的可选方法的实现。如果超类中缺少可选方法,则子类中也会将其标识为丢失。

我通过这个线程后就到了那里。这对我来说是真正的罪魁祸首。还要记住,在开发时对文件进行任何更改可能会随机解决问题(比如添加一些人建议的 shouldSelectItemAt。我这样做了,它修复了它,然后我删除了它并继续工作。我的然而,circleCI 构建仍然有 100% 的时间被破坏。

您是否在集合视图单元格中放置了按钮或交互式视图?你的touch被它处理了,那么didSelect就不调用了。

button.isUserInteractionEnabled = false

奇怪的是,这个问题只发生在我使用旧 iOS 版本(旧设备)的情况下,但这解决了它。