2009-05-20 13 views
30

Cuando se llama a un IBAction:Obtener texto de botón desde IBAction - iPhone

-(IBAction) onClick1: (id) sender; 

Lo que se pasa en el emisor? Como está conectado a través del IB, no estoy muy seguro. Mi pregunta es cómo hacer que el texto del botón sea el objeto pasado (lo más probable es que NSString sea) para poder llamarlo dentro de la implementación de la acción.

-(IBAction) onClick1: (id) sender { 
    NSLog(@"User clicked %@", sender); 
    // Do something here with the variable 'sender' 
} 

Respuesta

25

En realidad es:

-(IBAction) onClick1: (id) sender { 
    NSLog(@"User clicked %@", sender); 
    // Do something here with the variable 'sender' 
} 

sender no es un NSString, es de tipo id. Es solo el control que envió el evento. Por lo tanto, si su método se activa con un clic, se enviará el objeto UIButton al que se hizo clic. Puede acceder a todos los métodos y propiedades estándar de UIButton mediante programación.

+0

Ah, arreglado. Entonces, ¿de ahí todo lo que tengo que hacer es llamar al método getTitle? Después de lanzar el ID como un UIButton por supuesto? – Organiccat

+2

En realidad, ni siquiera necesita lanzarlo. Tal es la belleza del mensaje que pasa como opuesto al método de llamada en un lenguaje dinámico. :-) –

+1

Ah, y no creo que getTitle sea el mensaje que estás buscando. Haría [remitente actualTítulo], como dijo Matt en su respuesta. –

2

El remitente se debe definir como tipo id, no int o NSString. El remitente es el objeto real que llama al método; si lo conectó a un botón, será un UIButton, si se trata de un campo de texto, un UITextField. Puede usar esto para obtener información del control (por ejemplo, el valor de cadena actual del campo de texto) o compararla con una variable de instancia de IBOutlet si tiene múltiples controles conectados al mismo método de acción.

60

El sender debe ser el control que inició la acción. Sin embargo, no debe asumir su tipo y, en su lugar, debe dejarlo definido como id. En su lugar, la verificación de la clase del objeto en el método actual de la siguiente manera:

- (IBAction)onClick1:(id)sender { 
    // Make sure it's a UIButton 
    if (![sender isKindOfClass:[UIButton class]]) 
     return; 

    NSString *title = [(UIButton *)sender currentTitle]; 
} 
+0

No es necesario enviar el remitente a un UIButton. –

+5

Es cierto que no es necesario. Prefiero emitir mis identificaciones para que el compilador pueda advertirme si intento enviar un mensaje al tipo de objeto incorrecto. –

+0

La detección de funciones es definitivamente buena. – Joseph

2

sólo puede utilizar estos procedimientos para obtener la etiqueta del botón y determinar donde se ha hecho una:

NSLog(@"Clicked button: %@",[[sender titleLabel] text]); 

Para responder a su pregunta , el id es el objeto del IB.

+0

[label title del remitente] no está permitido si el remitente es id. – GameLoading

14
-(IBAction)onClick:(id) sender { 
    UIButton *btn = (UIButton *)sender; 

    //now btn is the same object. And to get title directly 
    NSLog(@"Clicked button: %@",[[btn titleLabel] text]); 
} 
10

simplemente escriba el siguiente código

-(IBAction) getButtonTitle:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    NSString *buttonTitle = button.currentTitle; 
    NSLog(@"Button Title %@",buttonTitle); 

} 

Eso es todo ... que has hecho !!!

1

a buscar el texto del botón:

NSLog(@"Date::%@",[DateButton titleForState:UIControlStateNormal]);   

Aquí DateButton es un nombre de la UIButton.

Cuestiones relacionadas