在 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】:
didSelectItemAtIndexPath
在none of the subView of collectionViewCell respond to that touch
时被调用。由于textView
响应这些触摸,所以它@987654324@ 响应它的superView,所以collectionView 不会得到它。
覆盖collectionViewCell
或CollectionView
子类的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 即可调用 becomeFirstResponder