如何处理UITableViewCell子视图UILabel上的触摸事件?

8
我的应用程序有一个自定义的UITableView。在其UIViewControllercellForRowAtIndexPath委托方法中,我实例化了包含多个自定义UILabels(实际上是OHAttributedLabel的子类)作为内容视图的子视图的自定义UITableViewCell对象。
我尝试在标签上设置userInteractionEnabled = YES,然后在视图控制器中添加触摸事件,但这并没有起作用。
有什么想法吗?
谢谢

哪里出了问题?你有检查在 touches 函数中是否使用了正确的视图吗? - Mundi
没有什么可以检查的,因为触摸方法从未被调用。 - Bama91
6个回答

13
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
      UITouch *touch = [[event allTouches] anyObject];
      if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])){
       //do whatever you want
     }
}

或者

UILabel *label = =[UILabel alloc]init];
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]     autorelease];
[label addGestureRecognizer:tapGesture];

对于您的第一个建议... 我在我的UILabel子类和父视图控制器中添加了touchesBegan和touchesEnded事件,但是当我触摸标签时,代码从未被执行(在我的自定义标签上设置了属性userInteractionEnabled为YES)。我不确定我缺少什么。 - Bama91
@Bama91,我不知道为什么触摸事件没有被调用,我认为你做错了一些事情。好的,无论如何,你试过我的第二个建议了吗?你需要使用自定义类标签创建并添加手势识别器,而不是使用UILabel *label = =[UILabel alloc]init();。 - Praveen-K
我的错。几个月前在测试时,我在父UITableViewCell的initWithStyle方法中设置了"userInteractionEnabled = NO"。在注释掉它之后,触摸事件按预期工作。此外,我发现OHAttributedLabel已经处理了触摸事件,所以我需要在我的子类中注意这一点。 - Bama91
哈哈哈哈 @Bama91,有时候这种事情发生也是正常的,所以我一直在想如果一切都正常为什么会出错。不过现在好了,一切都能正常工作了。 - Praveen-K

1

OHAttributedLabel存在问题。该标签还可以处理链接的点击。因此,如果要处理标签上任意点(而不仅仅是链接)的点击,则必须

self.textLabel.onlyCatchTouchesOnLinks = NO;

其中self.textLabel是您的OHAttributedLabel。 不要忘记设置userInteractionEnabled。


1

UILabel不是UIControl,所以你不能在UIControlEventTouchUpInside或类似事件上获得它的事件。为什么不使用按钮呢?你可以使它看起来像一个标签。

无论如何,在你的cellForRowAtIndexPath:方法中,你可能需要设置addTarget:action:forControlEvents:和UIButton的tag。在该方法中,通过检查标记值来检测哪个单元格的按钮被点击。

如果你必须使用UILabel,则需要子类化它并拦截touchesBegan/touchesEnded方法(从UIResponder继承)以自己检测UIControlEventTouchUpInside事件。


我正在使用OHAttributedLabel的子类,它本身是UILabel的子类,并添加了属性文本功能。如我上面的评论中所提到的,当触摸标签时,我的子类中添加的touchesBegan和touchesEnded方法从未被触发。 - Bama91

0

你可以使用TTTAttributedLabel来代替它。这非常容易。 当你初始化UITableViewCell时,你可以委托:TTTAttributedLabelDelegate 例如:

@interface MyTableViewCell : UITableViewCell<TTTAttributedLabelDelegate>{
    UILabel *nameLabel;
    TTTAttributedLabel *valueLabel;
}

当你初始化时,你可以将链接添加到标签中:

 [valueLabel addLinkToPhoneNumber:valueStr withRange:NSMakeRange(0, valueStr.length)];

所以,你可以做任何你想做的事情:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithPhoneNumber:(NSString *)phoneNumber{
   //do anything you want.

}

0

我不知道是否是同样的问题,但是... 我添加了一个标签,但无法识别触摸,最终我意识到这是因为我将其添加为子视图,但其框架超出了其父视图的框架,因此触摸层次结构被破坏了。


0

我在使用静态表格单元格来创建设置表时遇到了一个问题,我希望整个单元格都可以触发单元格中的文本框的第一响应者。

最终,我在标签(触摸不可用)和文本字段后面添加了一个透明的(自定义的、空白标题)按钮,因为手势识别器无法获取任何触摸。我认为这应该可以以更优雅的方式解决,但现在它已经解决了任务和限定的目的。(你可以从按钮的默认动作直接拖拽连接)

有点丑陋。不过,它只是描述了文本框后面的区域对触摸的反应。这毕竟就是意图。所以也许它并不那么花哨。

在找到手势识别器无法触发的原因之前,我会一直保留它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接