在UILabel上执行选择器会导致崩溃吗?

时间:2012-01-30 02:14:18

标签: objective-c ios uilabel selector

我读到UILabels并不是为了响应触摸事件,而是我可以使用UIButton。但是,我必须继承子类UILabel来覆盖另一个方法,所以我想我也可以使用标签来保持对代码的更改。

如何让我的标签响应触摸事件?显示的代码和错误如下。

UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(startingPoint, 5, 10, 22)];
    tempLabel.text = equationText;
    tempLabel.font = [UIFont systemFontOfSize:13];
   [tempLabel sizeToFit];
    [view addSubview:tempLabel];
    [tempLabel addTarget:self action:@selector(updateLabel:) forControlEvents:UIControlEventTouchUpInside]; // UNRECOGNIZED SELECTOR SENT TO INSTANCE

4 个答案:

答案 0 :(得分:9)

由于UILabel不是控件,因此您无法发送-addTarget:action:forControlEvents:消息。您必须从您的应用程序中删除该行,因为您的标签不是控件,并且永远不会响应该消息。相反,如果您想使用标签,可以将其设置为交互式并为其添加手势识别器:

// label setup code omitted
UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(updateLabel:)];
[tempLabel setUserInteractionEnabled:YES];
[tempLabel addGestureRecognizer:tap];
[tap release]; // if not using ARC

手势识别器的回调将传递触发它的手势识别器的实例,而不是像动作消息那样的控件。要获取触发事件的标签实例,请使用-view向传入的手势识别器发送消息。因此,如果您的updateLabel:方法可能如下所示:

- (void)updateLabel:(UIGestureRecognizer*)recognizer
{
  // Only respond if we're in the ended state (similar to touchupinside)
  if( [recognizer state] == UIGestureRecognizerStateEnded ) {
    // the label that was tapped
    UILabel* label = (UILabel*)[recognizer view];

    // do things with your label
  }
}

此外,手势识别器将调用具有多个状态的动作方法,类似于-touchesBegan:...系列方法中的状态。您应该在识别器处于适当状态时检查您是否只是在进行工作。对于简单的点击手势识别器,您可能只想在识别器处于UIGestureRecognizerStateEnded状态时才能工作(参见上面的示例)。有关手势识别器的详细信息,请参阅UIGestureRecognizer的文档。

答案 1 :(得分:1)

//创建标签

_label = [[UILabel alloc] initWithFrame:CGRectMake(self.view.center.x-75,self.view.frame.size.height-60,150,50)];

_label.backgroundColor = [UIColor clearColor];
_label.textColor=[UIColor whiteColor];
_label.text = @"Forgot password ?";
UITapGestureRecognizer *recongniser = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];//ADD ACTION TO LABEL
[_label setUserInteractionEnabled:YES];
[_label addGestureRecognizer:recongniser];

//导航到ONEVIEW到另一个视图

- (void)tapAction //将其添加到LABEL SELECTOR的方法

{

_forgotviewController=[[ForgotPassword alloc]init];
[self.navigationController pushViewController:self.forgotviewController animated:YES];

}

答案 2 :(得分:0)

最聪明的做法是使用UIButton来做你想做的事。

但是如果你真的想要继承UILabel,请确保将userInteractionEnabled设置为YES。

The documentation says

  

默认情况下,新标签对象配置为忽略用户事件。   如果要在UILabel的自定义子类中处理事件,则必须   显式更改userInteractionEnabled属性的值   初始化对象后为YES。

并且addTarget: action: forControlEvents:不起作用,因为UILabel不是UIControl的后代。您可以通过在子类中实现UIResponder的touchesBegan:withEvent:方法来捕获您的事件。

答案 3 :(得分:0)

这是 UILabel 点击

的swift 2.1版本
let label = UILabel(frameSize)

let gesture = UITapGestureRecognizer(target: self, action: "labelTapped:")
labelHaveAccount.userInteractionEnabled = true
labelHaveAccount.addGestureRecognizer(gesture)

func labelTapped(gesture:UIGestureRecognizer!){
//lable tapped
}