2012-01-11 32 views
5

Necesito un UIButton para mantener un estado presionado. Básicamente, si un botón está en un estado normal, quiero tocar el botón, resaltarlo a su color azul estándar y luego permanecer azul después de levantar mi dedo. Hice la siguiente UIAction y conecté los botones Touch Up Inside al evento.No se puede mantener UIButton en el estado seleccionado después del Evento TouchUpInside

-(IBAction) emergencyButtonPress:(id) sender 
{ 
    if(emergencyButton.highlighted) 
    { 
     emergencyButton.selected = NO; 
     emergencyButton.highlighted = NO; 
    } 
    else 
    { 
     emergencyButton.selected = YES; 
     emergencyButton.highlighted = YES; 
    } 
} 

Pero lo que sucede, después de quitar mi dedo, el botón vuelve a un fondo blanco. Para una prueba he añadido un UISwitch y tienen que ejecutar el mismo código:

-(IBAction) emergencySwitchClick:(id) sender 
{ 
    if(emergencyButton.highlighted) 
    { 
     emergencyButton.selected = NO; 
     emergencyButton.highlighted = NO; 
    } 
    else 
    { 
     emergencyButton.selected = YES; 
     emergencyButton.highlighted = YES; 
    } 
} 

En este caso, el botón para cambiar a un estado de manifiesto la no marcada y lo que cabe esperar.

¿Hay algún otro evento que ocurra después del evento Touch Up Inside que está restableciendo el estado a 'normal'? ¿Cómo mantengo el estado resaltado?

Respuesta

1

si desea que funcione el código anterior, debe establecer una imagen para el estado seleccionado y otra (incluso la misma) para el estado resaltado.

[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateHighlighted]; 
[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateSelected]; 

espero que ayude.

+0

Gracias por la respuesta. Agregué esas líneas a mi función viewdidload: Ahora cuando presiono y sostengo el botón, veo la imagen, pero cuando dejo el botón vuelve a blanco – WolfpackEE

2

Si quieres algo así como un botón de activación, modifica su estado "seleccionado" para que sea su Estado "pulsado", y luego escribir algo como esto:

- (IBAction)buttonTapped:(id)sender { 
    [(UIButton*)sender setSelected:![sender isSelected]]; 
} 
0

Esto no es posible por desgracia, tan pronto como sea dejas ir Apple cambia el estado nuevamente. Una de las opciones que he usado anteriormente (pero no es bonita) es que usa un selector de rendimiento con demora 0.1 después de que se presiona el botón para ponerlo de nuevo en el estado seleccionado. Esto funcionó en mi caso.

EDIT: Si no desea ver el efecto de parpadeo, simplemente establecer un retraso de 0.0

+0

Guau, eso funciona. Hay un rápido destello del botón de azul a blanco a azul. Tendré que ver si eso es aceptable para el usuario final. Gracias por el consejo. – WolfpackEE

+0

no hay problema, si le funciona, ¿podría marcar esto como la respuesta correcta? Siempre es mejor si todas las publicaciones tienen respuestas marcadas :) –

6

El estado resaltado se aplica y se elimina por iOS cuando se toca/suelte el botón. Así que no dependas de él en tu método de acción.

Como una de las otras respuestas dice, ajuste la imagen resaltada a ser la misma que la imagen seleccionada, y luego modificar su método de acción:

-(IBAction) emergencyButtonPress:(id) sender 
{ 
    emergencyButton.selected = !emergencyButton.selected;  
} 
1

tenía este mismo problema, y ​​esto es lo que funcionó para mí:

-(IBAction)buttonPressed:(id)sender { 
if (isSelected) { 
    [_button setSelected:NO]; 
    [_button setImage:[UIImage imageNamed:@"not_selected.png"] forState:UIControlStateSelected]; 
    isSelected=NO; 

} 
else { 
    [_button setSelected:YES]; 
    [_button setImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected]; 
    isSelected=YES; 
} 
} 
0

esto funcionó para mí:

- (void)tapButton:(id)sender{ 
    UIButton *button = sender; 
    if (!button.selected){ 
     [self performSelector:@selector(highlight:) withObject:button afterDelay:0.0]; 
    }else{ 
     [self performSelector:@selector(removeHighlight:) withObject:button afterDelay:0.0]; 
    } 
} 

- (void)highlight:(UIButton *)button{ 
    button.selected = !button.selected; 
    button.highlighted = YES; 
} 

- (void)removeHighlight:(UIButton *)button{ 
    button.selected = !button.selected; 
    button.highlighted = NO; 
} 
0

probar este simple respuesta ....

- (void)mybutton:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    button.selected = ![button isSelected]; // Important line 
    if (button.selected) 
    { 
     NSLog(@"Selected"); 
     NSLog(@"%i",button.tag); 
    } 
    else 
    { 
     NSLog(@"Un Selected"); 
     NSLog(@"%i",button.tag); 

    } 
} 
+0

¿Puedes explicar el 'button.selected =! [Button isSelected];' por qué es importante y qué está haciendo? – jckly

Cuestiones relacionadas