在我安装了最新的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文件,代表们都是正确的。)
答案 0 :(得分:2)
委托方法可能已重命名。检查您是否正在实施:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
还要再次检查您是否仍将控制器设置为UICollectionView的委托。
答案 1 :(得分:2)
查看此问题并回答:https://stackoverflow.com/a/55393950/1943064
基本上,swift 5上存在一个关于由超类实现的协议的可选方法的实现的错误。如果超类中缺少可选方法,则在子类中也将其标识为缺少。
经过此线程后,我到了那里。这是我真正的罪魁祸首。另外请记住,在开发人员构建文件时对文件进行任何更改都可能会随机解决此问题(例如,添加了一些人建议的shouldSelectItemAt。我这样做了,并对其进行了修复,然后将其删除并保持工作。)但是,circleCI构建仍被100%破坏了。
答案 2 :(得分:0)
您是否在集合视图单元格中放置了按钮或交互式视图?您的触摸由它处理,然后不调用 didSelect。
button.isUserInteractionEnabled = false
奇怪的是,这个问题只发生在我使用较旧的 iOS 版本(较旧的设备)的情况下,但这已经解决了。