【问题标题】:UICollectionView didSelectItemAtIndexPath not called when tapped on UITextView在 UITextView 上点击时未调用 UICollectionView didSelectItemAtIndexPath
【发布时间】:2014-02-23 15:32:59
【问题描述】:

我有一个带有自定义单元格的 UICollectionView - 他们有一个 UITextView 主要覆盖整个单元格。这在使用didSelectItemAtIndexPath 时会出现问题。触发它的唯一方法是在UITextView 之外点击。我希望它在您点击的单元格中的任何位置触发,无论是否有文本视图。如何做到这一点?

【问题讨论】:

  • 我建议对每个单元格使用UIGestureRecognizer,并在将其发送到文本视图或其他任何内容时,也许有更好的解决方案,但我会使用这个 1
  • 通过添加 UITapGestureRecognizer(感谢 @Roma-MT)并使用 indexPathForItemAtPoint 解决了问题:
  • 那我来回答一下:)。
  • 你能分享你的代码吗?谢谢

标签: ios ios7 uicollectionview uicollectionviewcell


【解决方案1】:

didSelectItemAtIndexPathnone of the subView of collectionViewCell respond to that touch 时被调用。由于textView 响应这些触摸,所以它@98​​7654324@ 响应它的superView,所以collectionView 不会得到它。

覆盖collectionViewCellCollectionView 子类的hitTest:withEvent 方法,并始终从它们返回self。因此它明确地将collectionView 设为first responder

【讨论】:

  • 我将这段代码添加到我的 UICollectionViewCell 实现中:- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { return self; } 这完全禁用了点击,现在在文本视图之外点击时甚至不会触发。
  • 你确定你没有在 UICollectionViewCell 中实现 touchesBegan 方法吗?你不应该覆盖单元格中的 touchesBegan。
  • 虽然问题解决了,但我可以告诉你,没有 touches-methods。如果您有兴趣,这里是代码- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (void)setTextViewText:(NSString *)text { self.textView.text = text; } - (void)setTitleLabelText:(NSString *)text { self.titleLabel.text = text; }
  • 这就是我遇到问题的原因。通过在我的文本视图上禁用用户交互,触摸事件开始转发给我的委托。
  • @AbdullahAjmal 我不确定你到底想要什么。据我了解,如果您想同时识别它们,您可以使用同时识别手势等 api 委托方法。你可以玩那个。但我会说,根据 iOS 标准,让 textView 和 collectionView 都响应触摸是一种不好的方式。
【解决方案2】:

我建议对每个单元格使用UIGestureRecognizer,当它用胶带将其发送到UITextView 或其他任何地方时,也许有更好的解决方案,但出于简单原因,我会使用这个 1。

【讨论】:

    【解决方案3】:

    你会覆盖touchesEnded: withEvent: 吗?

    我今天遇到了同样的问题,发现我在collectionview的一个容器视图中touchesEnded有一些自定义逻辑,我没有调用

     [super touchesEnded: withEvent:]
    

    当我在touchesEnded 中完成我的自定义逻辑时。

    添加超级调用后,一切正常。

    【讨论】:

      【解决方案4】:

      选择UITextView,在特定情况下为UICollectionViewCell,然后切换到属性检查器。取消选中启用用户交互,它应该可以正常工作。

      【讨论】:

        【解决方案5】:

        当我有一个滚动视图占据了我的整个集合视图单元格时,我遇到了这个问题。虽然上述所有解决方案可能都可以正常工作,但我想出了自己优雅的解决方法。我在滚动视图下放置了一个“选择”标签。由于标签不是滚动视图的一部分,它会将点击事件传递给集合视图。它还可以很好地指示用户需要执行操作。

        【讨论】:

          【解决方案6】:

          就这样做

          textview.isUserInteractionEnabled = false 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多