2012-01-09 25 views
5

Estoy intentando cambiar la acción para el UIButton en ios applicatio. Yo siguiente código¿Es posible cambiar la acción de UIButton?

button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

    [button addTarget:self action:@selector(aMethodShow:) forControlEvents:UIControlEventTouchDown]; 

    [button setTitle:@"Show View" forState:UIControlStateNormal]; 

    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0); 

    [view addSubview:button]; 

en particular la sección que quiero cambiar de Acción para este botón .Así lo hice

[button addTarget:self action:@selector(aMethodHide:) forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Hide View" forState:UIControlStateNormal]; 

Desafortunadamente Esta nota el código de trabajo?

+0

aMethodShow está trabajando ¿por primera vez? aMethodHide no funciona cuando lo cambias? –

+0

dos acciones están tomando el mismo evento (clic) para el botón, ¿cómo puedo eliminar el primer objetivo? –

+0

¿Quiere decir que cuando hace clic, ambos métodos son invocados? –

Respuesta

17

Sugiero antes de agregar un nuevo objetivo, primero invoque removeTarget en el objeto UIbutton y luego agregue un nuevo objetivo con otra acción.

+0

Funciona bien, por qué se invoca esta acción para el mismo evento –

2

Puede usar el mismo objetivo de acción en lugar de usar dos objetivos. En un objetivo hay que diferenciar, como a continuación

-(void)btnAction 
{ 
     if(target1) 
      { 
      // code for target 1 
      } 

     else 
     { 
      // code for target 2 
     } 

} 

Aquí destino1 es BOOL valor cuyo valor primero dispuesto a ser YES. Y cambie su valor NO siempre que desee realizar el código del objetivo 2.

Espero que esto te ayude.

+0

Si no quiero verificar la condición, si estoy configurando el objetivo más de una vez con un selector diferente (showButton, HideButton, etc.) Todas las acciones invocadas simultáneamente ... ¿por qué? esto sucede? –

0

Hice una aplicación recientemente y tuve la misma situación, pero encontré otra manera de resolverla, así que decidí compartir mi solución con personas que pudieran estar en la misma situación.

Voy a tratar de explicar lo que hice con el contexto de esta pregunta:

  • he añadido una etiqueta a la button y me asocié con una de las funciones que tiene que llamar a button (aMethodShow: por ejemplo).

  • button siempre llaman a la misma función (callSpecificFunc: por ejemplo). Lo que hace callSpecificFunc: es llamar a la función aMethodShow: o aMethodHide de acuerdo con la etiqueta button actual.

  • En la sección particular en la que el button necesita llamar a una función diferente, solo cambio la etiqueta de button.

Algo como esto:

NSInteger tagOne = 1000; //tag associated with 'aMethodShow' func 
NSInteger tagTwo = 1001; //tag associated with 'aMethodHide' func 

button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self action:@selector(callSpecificFunc:) forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Show View" forState:UIControlStateNormal]; 
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0); 
[view addSubview:button]; 

... 
// in some part of code, if we want to call 'aMethodShow' function, 
// we set the button's tag like this 
button.tag = tagOne 

... 

//Now, if we want to call 'aMethodHide', just change the button's tag 
button.tag = tagTwo 

... 

-(void) callSpecificFunc:(UIButton*)sender 
{ 
    NSInteger tagOne = 1000; 
    NSInteger tagTwo = 1001; 

    if([sender tag] == tagOne){ 
     //do whatever 'aMethodShow' does 
    }else { 
     //do whatever 'aMethodHide' does 
    } 
} 

Por supuesto que podría ser aplicado durante más de 2 funciones :)

8

Creo que le ayudará a

[yourButton removeTarget:nil 
       action:NULL 
    forControlEvents:UIControlEventAllEvents]; 

[yourButton addTarget:self 
       action:@selector(yourAction:) 
    forControlEvents:UIControlEventTouchUpInside]; 
Cuestiones relacionadas