2010-07-03 11 views
96

Bien, entonces tengo un UILabel creado en el constructor de interfaz que muestra algo del texto predeterminado de "toque para comenzar".Manejando evento Touch en UILabel y conectándolo a un IBAction

Cuando el usuario toca la UILabel quiero para que active un método IBAction: -(IBAction)next; que actualiza el texto en la etiqueta para decir algo nuevo.
Sería muy conveniente si esto me permitiera simplemente arrastrar una conexión de mi método a mi etiqueta y luego seleccionar retocar adentro, como con un botón. pero, por desgracia, no hay cigarro.

Así que de todos modos, supongo que mi pregunta es, ¿tendré que subclase UILabel para hacer que esto funcione? ¿O hay alguna forma de que pueda arrastrar un botón sobre la etiqueta, pero que sea 0% opaco? ¿O hay una solución más simple que me falta?

Respuesta

252

Compruébelo usted mismo:

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

El truco es permitir la interacción del usuario.

+1

¿Qué sucede si tengo varias etiquetas? ¿cómo podría diferenciar cuál fue aprovechado? – learner

+1

@learner prueba la propiedad de etiqueta. asegúrese de usar labelTap: en vez de labelTap. y use - (void) labelTap: (id) remitente ;. – thedjaney

+1

@thedjaney El remitente es el UITapGestureRecognizer, no el UILabel – h4labs

70

UILabel hereda de UIView que hereda de UIResponder. Todos los objetos UIresponder pueden manejar eventos táctiles. Así que en el archivo de clase, que sabe acerca de su visión (que contiene el UILabel) aplicar:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event; 

En constructor de interfaces establecer el valor de etiqueta de la UILabel. cuando toques se producen en su método de touchesBegan, comprobar el valor de la etiqueta de la vista a la que pertenece la etiqueta:

UITouch *touch = [touches anyObject]; 

if(touch.view.tag == MY_TAG_VAL) 
label.text = @"new text"; 

de conectar el código en el archivo de clase, con el objeto UILabel en constructor de interfaces, al declarar la variable de instancia UILabel con el prefijo IBOutlet:

IBOutlet UILabel *label; 

Luego, en el generador de interfaz puede conectarlos.

+0

rápido y simple, muchas gracias, me salvaste un tiempo muy serio. – wbarksdale

+31

Una nota, debe asegurarse de marcar "Interacción del usuario habilitada" en el constructor de interfaz, o esto no funcionará. – midas06

+0

Me sale un problema con este método. Funcionó bien cuando el controlador de vista se cargó directamente, pero cuando creé un controlador de navegación, empujé el controlador que contiene la etiqueta al controlador de navegación y luego lo visualicé, los toques ya no parecen llegar a la etiqueta. ¿Algunas ideas? – midas06

30

Puede usar un UIButton, hacerlo transparente, es decir, un tipo personalizado sin una imagen y agregarle un UILabel (centrado). Luego conecte los eventos de botón normales.

+0

Acepto, el tipo de botón personalizado debería darle una experiencia de usuario de tipo UILabel. – stitz

+2

+1, bonito y simple. Había intentado esto antes al configurar un botón normal para opacidad 0 que no funcionó, pero el consejo para cambiar el tipo a personalizado funcionó perfectamente. –

+0

La opacidad afectará al botón y a todas sus subvistas, por lo que opacity = 0 hará que todo sea invisible. – Eiko

6

Swift 3

Usted tiene una IBOutlet

@IBOutlet var label: UILabel! 

En lo que habilita la interacción del usuario y añadir un reconocedor gesto

label.isUserInteractionEnabled = true 
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:))) 
label.addGestureRecognizer(tapGesture) 

Y, por último, manejar el grifo

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) { 
    // Your code goes here 
} 
Cuestiones relacionadas