在 UITextView 上点击时未调用 UICollectionView didSelectItemAtIndexPath

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于在 UITextView 上点击时未调用 UICollectionView didSelectItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 使用自动布局自动调整大小

无需用户点击 UITextView 即可调用 becomeFirstResponder

在 UITextView 中使图像可点击

单击提交时未调用Django视图功能

用户点击 UIKeyboard 中的完成按钮时未调用 textFieldShouldEndEditing

点击 UITabBar 时未调用子视图控制器的 viewDidDisappear