2008-11-21 21 views
16

Estoy tratando de agregar un UIButton en tiempo de ejecución, sin embargo, no está visible. ¿Qué estoy haciendo mal?Cómo agregar un UIButton en tiempo de ejecución

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     UIButton *btn = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; 
     btn.frame = CGRectMake(0, 0, 100, 25); 
     btn.backgroundColor = [UIColor clearColor]; 
     [btn setTitle:@"Play" forState:UIControlStateNormal]; 
     [btn addTarget:self action:@selector(buttonClick:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     btn.center = self.center; 
     [self addSubview:btn]; 
    } 
    return self; 
} 
+3

Este código tendrá fugas; estás reteniendo tu objeto btn, pero nunca lo liberas. El primer mensaje de retención es innecesario. –

+0

He logrado buenos resultados al agregar la vista UIButton a la subvista de viewDidLoad en lugar de algunos métodos de inicio. –

+0

Yo también tengo el mismo problema. ¿Cuál fue el problema real? – iOS

Respuesta

9

Primero, asegúrese de que se está llamando al método initWithFrame :. Si su vista está en un Nib, se llama a initWithCoder:

En segundo lugar, es el botón la única subvista (de su código parece que es, pero nunca se sabe). El botón podría estar oculto detrás de otra subvista. Llame a bringSubviewToFront: si es necesario.

Finalmente, ¿está visible la vista en sí? ¿Es lo suficientemente grande como para mostrar el botón? Dado su ejemplo, si la vista tiene menos de 100 píxeles de ancho, el botón no se mostrará porque quedará recortado por los límites de la vista.

+0

Entonces, ¿qué lo resolvió? Estas son tres posibilidades ... ¿podría publicar el código que funcionó? –

0

si todavía no funciona, intente eliminar el: al final del nombre del selector: @selector (buttonClick)

1

Debe liberar btn y quitar ":" en buttonClick:

UIButton *btn= [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; 
btn.frame = CGRectMake(0, 0, 100, 25); 
btn.backgroundColor = [UIColor clearColor]; 
[btn setTitle:@"Play" forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:btn]; 
[btn release]; 
+0

Decir que eliminar el: en 'buttonClick' es inapropiado. Los controladores predeterminados son - (nulo) onClick: (id) remitente. Entonces, se requeriría un ":". Si el controlador no tiene una entrada, entonces sí. Una alternativa para liberar sería soltar automáticamente el botón en la declaración de creación. – GtotheB

0

No necesita conservar el UIButton porque lo conserva [self.view addSubview: btn];

+0

Esto no está relacionado con el problema del OP. –

0

Primero compruebe si su código está ejecutando el método initwithFrame. Porque si está cargando la vista a partir de cacao es decir utilizando

NSArray *xibviews = [[NSBundle mainBundle] loadNibNamed: @"MySubview" owner: mySubview options: NULL]; 
MySubview *msView = [xibviews objectAtIndex: 0]; 
[self.view addSubview:msView]; 

continuación, la parte initWithFrame no será executing.So favor verifica una vez.

Cuestiones relacionadas