2009-06-26 17 views
12

En el método viewDidLoad un UIViewController, hago esto:¿Por qué no se muestra el título UIButton?

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b];      // EDIT: should be 'b' 
NSLog(@"button title: %@", [b titleLabel].text); 

El botón muestra el título, pero no lo hace. La línea NSLog imprime "Testing" en la consola. ¿Alguna sugerencia sobre lo que estoy haciendo mal?

+0

Dos ideas: * ¿Qué ocurre si haces que tu botón sea más grande? * ¿Estás haciendo algo más en viewDidLoad que podría estar afectando el botón? – JonathonW

+0

Consulte la solución de diederikh a continuación, ya que describe un error en el inicializador doble utilizado anteriormente, así como la solución para él, que es asignar el marco por separado, después de que el inicializador de conveniencia [... botón con tipo ...] finalice. El resto de la solución del OP es correcta y sigue siendo la misma. – eGanges

Respuesta

38

No puedo decir por qué no funciona, pero tengo una solución:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect] ;   
b. frame = CGRectMake(0, 0, 100, 100); 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self addSubview:b]; 

separada crear el marco de la asignación y el inicio del botón.

+0

Estoy de acuerdo. Apuesto a que encadenar dos inicializadores juntos como lo hace está causando algunos problemas. Use el botón ConTipo y luego configure el marco. – LucasTizma

+1

setTitle lo hizo, gracias – Eugene

+0

Sí, 'buttonWithType' es un método de fábrica estático que devuelve un botón completamente inicializado. No puede invocar 'initWithFrame' en un botón ya inicializado (el resultado está, en el mejor de los casos, indefinido). Los métodos 'init' solo deben llamarse después de' alloc'. – devios1

4

hacer esto en su lugar:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
b.frame = CGRectMake(0, 0, 100, 100); 
[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
22

El problema radica en

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

buttonWithType devuelve un objeto inicializado autoreleased. No puede enviar un initWithFrame nuevamente ya que un objeto solo se puede inicializar una vez.

Establecer su marco por separado:

b.frame = CGRectMake(0, 0, 100, 100); 
0

La cosa es que hay que ir a por [[UIButton alloc] initWithFrame:] o [UIButton buttonWithType:], no debe utilizar los dos juntos.

0

Usted puede hacer lo siguiente:

UIButton *b=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 

b=[UIButton buttonWithType:UIButtonTypeRoundedRect];

[b setTitle:@"Button Title Here" forState:UIControlStateNormal]; 
[b setTitleColor:[UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
0

que tenían el mismo problema y que terminó siendo el hecho de que yo estaba sentado la imagen en lugar de la BackgroundImage. Todo funcionó bien cuando lo hice:

[button setBackgroundImage:image forState:UIControlStateNormal]; 
Cuestiones relacionadas