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

时间:2011-08-14 20:09:34

标签: iphone objective-c ios cocoa-touch uitableview

我的应用有自定义UITableView。在其cellForRowAtIndexPath的{​​{1}}委托方法中,我实例化包含多个自定义UILabel(实际上是UIViewController的子类)的自定义UITableViewCell对象作为内容视图的子视图

我尝试在标签上设置OHAttributedLabel,然后在视图控制器中添加触摸事件,但这不起作用。

想法?

由于

6 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

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

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

如果必须使用UILabel,则需要对其进行子类化并拦截touchesBegan / touchesEnded方法(继承自UIResponder)以自行检测UIControlEventTouchUpInside。

答案 2 :(得分:1)

OHAttributedLabel中的问题。此标签还可以处理链接。因此,对于手柄点击任何标签点(不仅仅是链接),您必须

self.textLabel.onlyCatchTouchesOnLinks = NO;

其中self.textLabel是您的OHAttributedLabel。 并且不要忘记userInteractionEnabled。

答案 3 :(得分:0)

我不知道它是否是同一个问题但是......我添加了一个标签并且无法识别触摸,我终于意识到这是因为我将它添加为子视图,但它的框架超出了它的父母的框架,因此触摸heirarchy打破了

答案 4 :(得分:0)

我刚才遇到了将静态表格单元格用于设置表的问题,我希望整个单元格触发单元格文本字段的第一个响应者。

我最后在没有使用手势识别器进行任何触摸后,在标签后面添加了透明(自定义,空白标题)按钮(触摸已禁用)和文本字段。我认为它应该以更优雅的方式工作,但它解决了现在的任务和有限的目的。 (您只需从按钮的默认操作拖动连接)

有点难看。然后,它再次描述了文本字段背后触摸的区域。毕竟这是意图。也许它只是不那么花哨。

将保留它,直到我找到识别器未触发的原因。

答案 5 :(得分: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.

}