ultima que puedo puede mini hasta actualizar actualizacion ios objective-c uibutton ios7 xcode5

ios - que - El texto del título de UIButton no se actualiza incluso si lo actualizo en el hilo principal



no puedo actualizar mi iphone 6 (23)

Estoy tratando de cambiar el título de un UIButton que he creado mediante programación, cuando el usuario hace clic en él. Entonces, este es mi código para crear el UIButton :

myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)]; [myButton setBackgroundColor:[UIColor blackColor]]; [myButton setAlpha:0.7]; [myButton setTitle:@"Hello" forState:UIControlStateNormal]; [myButton addTarget:self action:@selector(userClicked:) forControlEvents:UIControlEventTouchUpInside]; [parentView addSubview:myButton];

Y, en mi método userClicked: hago:

-(void) userClicked:(UIButton*)button { NSLog(@"USER CLICKED!!!"); if ([NSThread isMainThread]) { NSLog(@"is main thread"); } [button setTitle:@"Bye" forState:UIControlStateHighlighted]; [button setTitle:@"Bye" forState:UIControlStateNormal]; [button setTitle:@"Bye" forState:UIControlStateSelected]; [self someLengthyComputation]; }

Lo extraño es que puedo ver los mensajes de registro impresos:

USER CLICKED!!! isMainThread

¡Pero, el título del botón no cambia! ¿Qué estoy haciendo mal?

EDITAR: Establecer el título para varios estados tampoco funciona.

EDIT2: Si imprimo la descripción del botón en la ventana del depurador de Xcode, ¡se muestra el título correcto!

Printing description of button->_titleView: <UIButtonLabel: 0xa4c9310; frame = (95 216; 130 22); text = ''Bye''; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa44f080>>


Bueno, todo se trata del estado habilitado de un UIButton, Apple ha cambiado algo en 7.1 que no le permite cambiar el título si tiene el UIButton en estado desactivado, eso es todo.

Gracias, Apple, he perdido 10 min. depurando una aplicación que funcionaba bien.

Acabo de enterarme esta mañana, tengo actualizado XCode ayer a la 5.1.1 y iOS a 7.1


Cambia el tipo de botón a ''Personalizado'', en lugar de ''Sistema'' y funcionará como se espera :)


Conclusión después de probar muchas soluciones es usar setAttributedTitle en lugar de setTitle.

Para crear la cadena de título para AttributedString:

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "]; [button setAttributedTitle:attString forState:UIControlStateNormal];

Por cierto, este problema no ocurre ocasionalmente en condiciones normales, pero de repente sucede principalmente por las siguientes razones:

  1. Si cambia el estado habilitado de un UIButton e intenta cambiar el título.

  2. Si usa un valor atribuido y luego desea cambiarlo usando setTitle, el valor atribuido es superior al título en ese caso.

  3. Si navega a otro controlador de vista y luego regresa para actualizar el título del botón.


Dudo si se pasó el "botón" ya que un parámetro es myButton. De todos modos, si myButton es una var miembro, puede simplemente [myButton setTitle: @ "Bye" forState: UIControlStateNormal];


En este momento, el trabajo más corto que he hecho es llamar:

[button setNeedsLayout];

Después de actualizar el título.

Esto parece suceder en iOS 7.1. Todos mis botones, que se comportaban correctamente en versiones anteriores de iOS (o tal vez solo compilados con SDK anteriores) de repente dejaron de hacerlo cuando se compilaron en Xcode 5.1.1 SDK 7.1.

Parece el error de Apple.


En iOS 7, el título de UIButton no se actualiza cuando está deshabilitado. Parece un error en iOS 7.

Como solución alternativa, actualice tanto el título normal como el deshabilitado. ¡Funciona!

[button setTitle:title forState:UIControlStateNormal]; [button setTitle:title forState:UIControlStateDisabled];


En mi caso, probé todo, pero nada funcionaba. Luego acabo de cambiar el tipo de botón del sistema a la costumbre del guión gráfico. ¡AUGE! todo comenzó a comportarse normalmente.


Estaba teniendo el mismo problema, y ​​me di cuenta de que en cualquier otro lugar estaba configurando el título atribuido. Entonces, cualquier actualización del título no estaba afectando el título atribuido.

Mi solución:

[button setAttributedTitle:@"" forState:UIControlStateNormal];

en lugar de

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


Esto es un poco tarde y de alguna manera se relaciona con la respuesta de Walter Schurter:

Tuve un problema similar donde el texto de mi botón se estaba configurando correctamente hasta que actualicé a 7.1. Luego descubrí que, dado que mi botón estaba deshabilitado, tuve que configurar el color del título y el texto del título para el estado desactivado para que el texto apareciera. ¡Entonces todo funcionó como un amuleto!


Esto funcionó para que actualizara el texto del título (iOS 7.1, Xcode 5.1):

button.enabled = FALSE; [button setTitle:@"Test" forState:UIControlStateNormal]; button.enabled = TRUE;


Esto puede ser trivial, pero si configuras una imagen de botón (en lugar de imagen de fondo) que llena todo el marco del botón, esto desplazará el título hacia la derecha y así lo hará invisible. Si es así, intente cambiar la imagen del botón a la imagen de fondo.


Finalmente, lo he descubierto. Hubo dos problemas:

1) el button no estaba en el estado UIControlStateNormal .

2) Estaba llamando a un método que realizaba un cálculo largo justo después de configurar el título, [self someLengthyComputation] .

He resuelto el problema por:

1) Establecer el título para todos los estados del botón.

2) Realizar ese gran cálculo en otro hilo, no en el hilo principal.

Mi código de trabajo ahora es:

-(void) userClicked:(UIButton*)button { NSLog(@"USER CLICKED!!!"); if ([NSThread isMainThread]) { NSLog(@"is main thread"); } [button setTitle:@"Bye" forState:UIControlStateHighlighted]; [button setTitle:@"Bye" forState:UIControlStateNormal]; [button setTitle:@"Bye" forState:UIControlStateSelected]; dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ [self someLengthyComputation]; }); }

¡Muchas gracias a todos los que respondieron / comentaron!


Hay varios problemas en su código:

Está asignando una devolución de llamada al botón:

@selector(userClicked:)

pero tu código está en otro método:

-(void)userTapOnTapToRefreshView:(UIButton*)button

Para solucionarlo necesitas implementar algo como esto:

-(void)userClicked:(id)sender { [(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal]; }

Además, esta parte del código no tiene sentido para mí:

[parentView myButton];

Intenta cambiarlo a:

[parentView addSubview:myButton];

Espero que ayude :)


Intente declarar su botón como una propiedad, ya sea en la interfaz o en la parte de implementación de su vista / vista del controlador

@property(nonatomic,strong) UIButton* myButton;

luego créalo

self.myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)]; [_myButton setBackgroundColor:[UIColor blackColor]]; ...

Deberia de funcionar. No me preguntes por qué realmente, solo creo que se trata de ARC / gestión de memoria moderna.

EDITAR:

También debería funcionar si mantiene una referencia en el botón en su implementación.

@implementation myViewController { UIButton* myButton; } -(void)createButton { myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)]; [myButton setBackgroundColor:[UIColor blackColor]]; ... } ...


Ninguno de los anteriores funcionó para mi caso (tenía un botón en la parte superior de una vista presentada con UIPopoverController), y tuve que eliminar FromSuperview antes de setTitle, luego agregué la revisión de nuevo. Espero que esto ayude a alguien con problemas similares.


No hay requisitos para usar:

[button setNeedsLayout]; [button layoutIfNeeded];

En su lugar, primero configure el tipo como DEFAULT en CUSTOM

Si aplicó setAttributedTitle , use:

[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];

De lo contrario, no hay necesidad de cambiar nada.

Si el color del texto no ha cambiado, aplique lo mismo y configure el color del título con:

[button setTitleColor:[any_color] forState:UIControlStateNormal];


Para Swift 3 solo use lo siguiente:

button.setTitle("My title", for: .normal)

o por un texto atribuido

button.setAttributedTitle(<AttributedString>, for: .normal)


Podría ser el problema de actualización del diseño del botón ... Intenta usar ...

[button setNeedsLayout]; [button layoutIfNeeded];

Obligará al botón para actualizar el diseño.


Por favor, vea si esto podría ayudarlo ... cuando se hace clic en el botón, compruebe la condición si ButtonToggled ... como a continuación cuando tiene una función como changeButtonText

-(IBAction)changeButtonText:(id)sender { if (!buttonToggled) { [sender setTitle:@"Initial Text" forState:UIControlStateNormal]; buttonToggled = YES; } else { [sender setTitle:@"Alternative Text" forState:UIControlStateNormal]; buttonToggled = NO; } }


Prueba esto:

[button setTitle:@"Bye" forState:UIControlStateHighlighted];

o:

[button setTitle:@"Bye" forState:UIControlStateSelected];

También puede modificar su función de vacío:

-(void) userClicked { NSLog(@"USER CLICKED!!!"); if ([NSThread isMainThread]) { NSLog(@"is main thread"); } [myButton setTitle:@"Bye" forState:UIControlStateNormal]; }


Según la guía del desarrollador de Apple, no debe establecer el texto o el color de la etiqueta del título del botón directamente como una propiedad (por ejemplo, no haga esto: myButton.titleLabel.text = @ "SomeText" o myButton.titleLabel.textColor = [UIColor blackColor] ]).

Por el contrario, los configura usando la funcionalidad del setter de UIButton, así:

[myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

...o así:

[myButton setTitle:@"SomeText" forState:UIControlStateNormal];.

Vea la guía de Apple .


Siempre agregueSubview antes de configurar el texto en UIButton.


Tuve un problema similar al usar storyboards. Usando las respuestas anteriores tuve que usar

[mybutton setTitle:@"SomeText" forState:UIControlStateNormal]; [button setNeedsLayout]; [button layoutIfNeeded];

Y tuve que asegurarme de que el tipo de botón era ''Personalizado'', no ''Sistema'' en el inspector de atributos.