我读到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
答案 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。
默认情况下,新标签对象配置为忽略用户事件。 如果要在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
}