【问题标题】:collectionView didSelectItemAtIndexPath stopped working after migrated to Xcode 10.2迁移到 Xcode 10.2 后,collectionView didSelectItemAtIndexPath 停止工作
【发布时间】:2019-08-26 21:42:09
【问题描述】:

在我安装了最新的 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文件都没碰过,代表们都是对的。)

【问题讨论】:

  • 请显示相关代码 - 即。你的didSelectItem(at:) 函数
  • 这段代码完全没有变化,所有的变化都与collection view完全无关
  • 可能需要更改代码,这就是我要求查看您的代码的原因。
  • @paulw11 请看一下代码。当前的事情是当点击一个项目时这个方法根本没有被调用。
  • 集合视图的allowsSelection 属性的值是多少?要么通过代码设置,要么通过 xib 文件设置。

标签: ios swift swift4 collectionview swift5


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!请检查我的编辑,在我看来其中一个参数确实已重命名,但更改为新名称后,仍然不起作用...
  • 您是否在任何地方实施 shouldSelectItemAt ?确保返回 true。另外,我在上面看到您修复了委托方法的名称,但是您是否验证了委托设置是否正确?
  • 应该是EditorViewController: UIViewController, SlideExitCallBackHandler, UICollectionViewDelegate {
  • 哇,它终于奏效了。我猜这一定是新版本 swift 中的新要求?因为文件没有这种继承,但一直工作正常。
  • UICollectionView 可能是用 Obj-C 编写的,因此它只会检查委托是否实现了该方法,但他们可能会对其进行更新以仔细检查委托是否首先实现了协议。
【解决方案2】:

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

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

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

【讨论】:

  • 我在 mikepj 的回答下关注了 cmets,它解决了我的问题。
  • @RainCast 但是您的任何超类是否已经实现了该协议?如果没有,它不起作用是正确的。
  • 但它在以前的版本中工作,这些不是新代码。似乎新的 swift 要求更严格。
【解决方案3】:

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

button.isUserInteractionEnabled = false

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

【讨论】:

  • 这个问题已经解决,请看被标记的答案。谢谢!
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多