2010-12-06 6 views
14

¿Por qué funciona el siguiente código:UIButton setTitle: forState: pregunta

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled]; 

mientras que esto no es así:

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted|UIControlStateDisabled]; 
+0

Guau, eso parece extraño que no funcione. +1 – BoltClock

+2

Observe que el nombre del método solo menciona un 'estado:' no 'estados:' singular. – Jasarien

+5

@Jasarien no deberían usar máscaras de bits entonces – bioffe

Respuesta

29

Sé que esta es una pregunta anterior, pero estas respuestas no son correctas.

Al configurar cada uno por separado que están diciendo la propiedad state debe ser UIControlStateHighlighted O UIControlStateDisabled pero no ambos

Cuando bit a bit o juntas están indicando que ambos deben establecerse en la propiedad state. Significado UIControlStateHighlighted AND UIControlStateDisabled se establecen en la propiedad state.

El siguiente código de ejemplo ilustra perfectamente mi punto. Si no está de acuerdo, ejecútelo usted mismo.

[button setTitle:@"highlighted and selected" forState:UIControlStateHighlighted | UIControlStateSelected]; 
[button setTitle:@"Highlighted only" forState:UIControlStateHighlighted]; 
[button setTitle:@"Selected only" forState:UIControlStateSelected]; 
[button setTitle:@"Normal" forState:UIControlStateNormal]; 

NSLog(@"Normal title: %@", [[button titleLabel] text]); // prints title: Normal 

[button setSelected:YES]; 

NSLog(@"Selected title: %@", [[button titleLabel] text]); // prints title: Selected only 

[button setSelected:NO]; 
[button setHighlighted:YES]; 

NSLog(@"highlighted title: %@", [[button titleLabel] text]); // prints title: Highlighted only 

[button setSelected:YES]; 

NSLog(@"highlighted and selected title: %@", [[button titleLabel] text]); // prints title: highlighted and selected 
+0

Totalmente en desacuerdo. Tienes una máscara donde cada bit representa un estado. Si se establece por separado, usa OR a nivel de bit. Siempre podemos recuperar el valor de la máscara para verificar eso. ¿Por qué no se puede configurar de una sola vez, más allá de mi comprensión? – bioffe

+0

¿Cómo se recupera el valor de la máscara para verificar que el estado de control bit a bit se haya aplicado en las dos llamadas anteriores? –

+4

@bioffer: Estás equivocado, Patrick tiene razón. Cada vez que llamas a 'setTitle: forState:' establece un título adicional dentro del botón y lo asigna a esa combinación de máscara en particular. Cuando una combinación de máscara no existe, vuelve al conjunto de títulos para la máscara UIControlStateNormal. Por ejemplo, si comenta la primera línea en el ejemplo de Patrick, el último 'NSLog()' imprimirá '' resaltado y el título seleccionado: normal "'. Esto se debe a que no estableció un título para cuando el botón está resaltado y seleccionado. –

2

Debido a que el setTitleColor: forState: método sólo puede aceptar un UIControlState conocido y se Están cargando dos valores de UIControlState juntos.

Cada UIControlState es (en un nivel bajo) muy probablemente una constante entera simple.

Actualización:

Es una máscara de bits, lo que lo convierte en un lugar más extraño que no funciona, pero mi punto sigue en pie. (Se inclina alarmantemente hacia un lado y se tambalea peligrosamente.)

+1

['UIControlState' es una máscara de bits.] (Http://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/c/tdef/UIControlState) – BoltClock

+0

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html%23//apple_ref/c/tdef/UIControlState – vikingosegundo

+0

Malo. Muy curioso que no funciona. (Presumiblemente no están comprobando qué bits están establecidos, simplemente comparando con las constantes conocidas). –

-1

Podría ser un error. Intente cambiar la máscara de bits con un valor inesperado como UIControlStateHighlighted & UIControlStateDisabled, y hará que todos los colores de estado sean los mismos.