调用 didHighlightItemAtIndexPath 而不调用 UICollectionView 的 didSelectItemAtIndexPath

Posted

技术标签:

【中文标题】调用 didHighlightItemAtIndexPath 而不调用 UICollectionView 的 didSelectItemAtIndexPath【英文标题】:Call to didHighlightItemAtIndexPath without a call to didSelectItemAtIndexPath for UICollectionView 【发布时间】:2015-04-16 23:09:03 【问题描述】:

我有一个 UICollectionView,我在我的 UICollectionViewCells 中覆盖了 hitTest:withEvent:,以便允许单元格外部的点击注册为单元格上的点击。

当我执行此操作并在现在注册为命中的单元格外部点击时,我会调用 didHighlightItemAtIndexPath 和 didUnhighlightItemAtIndexPath,但我没有收到对 didSelectItemAtIndexPath 的调用。如果我在单元格内点击,我会得到所有预期的突出显示并像以前一样选择项目调用。

我没有设置任何自定义手势识别器,也没有覆盖 touchesBegan 或类似的东西。

那么有谁知道在什么情况下您会调用 didHighlightItemAtIndexPath 而没有调用 didSelectItemAtIndexPath?有什么方法可以调用我的 didSelectItemAtIndexPath 吗?谢谢。

编辑

我忘了提到我的 UICollectionView 在 Today Widget 中,所以它包含在 Notification Center 滚动视图中。如果我将选择代码移动到 didUnhighlightItemAtIndexPath 中,那么当您在单元格外部点击时会调用它,但结果是如果不选择其中一个单元格,您实际上无法滚动通知中心。

所以也许我在这里遇到的突出显示和选择之间的区别与滚动视图响应程序取消单元格外的选择有关?

【问题讨论】:

不要覆盖hitTest:withEvent:,而是尝试覆盖pointInside:withEvent:。那效果更好吗? hitTest:withEvent:的默认实现使用pointInside:withEvent:,但也许UICollectionView也直接使用pointInside:withEvent: 我实际上已经覆盖了 pointInside:withEvent: 来实现它。它只从 hitTest:withEvent: 中调用过。 【参考方案1】:

好的,我知道发生了什么。

我向我的 UICollectionView 添加了一个新的 UITapGestureRecognizer。像这样实现它导致了我的解决方案:

- (void)cellSingleTap:(UITapGestureRecognizer *)sender

    CGPoint point = [sender locationInView:collectionView_];
    NSIndexPath *indexPath = [collectionView_ indexPathForItemAtPoint:point];
    [ .... ]

当我检查当我突出显示但没有选择时返回的点时,很明显它发生在点击的点位于集合视图布局的部分插图内时。当点击部分插入时,indexPathForItemAtPoint 调用返回 nil。

所以基本上集合视图将突出显示但不选择在单元格外部但在其部分插图内的点击。只要点击在单元格之外而不是在插图内,这些点击将导致对 didSelectItemAtIndexPath 的调用。

由于我希望插入内的点击算作单元格上的点击,因此我能够通过在调用 indexPathForItemAtPoint 之前调整点击点来解决此问题。

【讨论】:

以上是关于调用 didHighlightItemAtIndexPath 而不调用 UICollectionView 的 didSelectItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用

RPC 调用和 HTTP 调用的区别

js方法调用

深入理解Java虚拟机——方法调用(解析调用)