1

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

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

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

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

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

这里发生了什么?

更新:

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

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

我根据回答者的建议更新了以下内容。但是,仍然无法正常工作。

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

(我什至没有触摸xib文件,代表都正确。)

4

3 回答 3

4

看看这个问题和答案:https ://stackoverflow.com/a/55393950/1943064

本质上,swift 5 上存在一个关于实现由超类实现的协议的可选方法的错误。如果超类中缺少可选方法,则在子类中也将其标识为缺少。

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

于 2019-04-23T20:50:34.130 回答
3

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

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

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

于 2019-04-05T03:30:32.583 回答
0

您是否在集合视图单元格中放置了按钮或交互式视图?您的触摸由它处理,然后不调用 didSelect。

button.isUserInteractionEnabled = false

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

于 2021-03-20T00:49:59.857 回答