¿El selector de ejecución en UILabel genera crash?

Leí que UILabels no están destinados a responder a los events táctiles, y que solo podría usar un UIButton. Sin embargo, tengo que subclamar UILabel de todos modos para anular otro método, así que pensé que podría usar una label para mantener los cambios a mi código como mínimo.

¿Cómo puedo hacer que mi label responda a los events táctiles? El código y el error que se muestran a continuación.

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 

Como UILabel no es un control, no puede enviar el -addTarget:action:forControlEvents: Debe eliminar esa línea de su aplicación ya que su label no es un control y nunca responderá a ese post. En cambio, si desea utilizar su label, puede configurarla interactivamente y agregarle un reconocedor de gestos:

 // 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 

La callback para el reconocimiento de gestos pasará a la instancia del reconocimiento de gestos que lo activó, no al control como lo haría un post de acción. Para get la instancia de la label que activó el evento, post el reconocedor de gesto pasado con -view . Por lo tanto, si su método updateLabel: se puede implementar de la siguiente manera:

 - (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 } } 

Además, el reconocedor de gestos llamará al método de acción con múltiples estados, similar a los que se encuentran en la serie -touchesBegan:... Debes verificar que solo estás comprometiendo trabajo mientras el reconocedor está en el estado apropiado. Para su simple reconocimiento de gestos de pulsación, probablemente solo quiera hacer el trabajo cuando el reconocedor esté en el estado UIGestureRecognizerStateEnded (ver el ejemplo anterior). Para get más información sobre los reconocedores de gestos, consulte la documentation de UIGestureRecognizer .

// crear label

_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]; 

// NAVEGUE A UNA VISTA A OTRA VISTA

– (vacío) tapAcción // MÉTODO PARA AGREGARLO AL SELECTOR DE ETIQUETAS

{

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

}

Lo más inteligente que puede hacer aquí es usar un UIButton para hacer lo que está intentando hacer.

Pero si realmente desea subclass UILabel , asegúrese de configurar userInteractionEnabled en YES.

La documentation dice :

Los nuevos objects de tags están configurados para ignorar los events del usuario de manera pnetworkingeterminada. Si desea controlar events en una subclass personalizada de UILabel, debe cambiar explícitamente el valor de la propiedad userInteractionEnabled a YES después de inicializar el object.

Y addTarget: action: forControlEvents: no funcionaría, porque UILabel no desciende de UIControl . Un lugar en el que puedes captar tus events mediante la implementación de los toques de touchesBegan:withEvent: método en tu subclass.

Aquí está la versión 2.1 rápida para UILabel

 let label = UILabel(frameSize) let gesture = UITapGestureRecognizer(target: self, action: "labelTapped:") labelHaveAccount.userInteractionEnabled = true labelHaveAccount.addGestureRecognizer(gesture) func labelTapped(gesture:UIGestureRecognizer!){ //lable tapped }