2011-05-17 8 views
5

Tengo un UIButton que se agrega a una tabla vista programáticamente. El problema es que cuando se toca me topa con el selector no reconocido enviado al mensaje de error de la instancia.Selector no reconocido enviado al mensaje de error de instancia desde UIButton

UIButton *alertButton = [UIButton buttonWithType:UIButtonTypeInfoDark];  
    [alertButton addTarget:self.tableView action:@selector(showAlert:) 
      forControlEvents:UIControlEventTouchUpInside]; 
    alertButton.frame = CGRectMake(220.0, 20.0, 160.0, 40.0); 

    [self.tableView addSubview:alertButton]; 

y aquí está el método de alerta que quiero para disparar cuando se toca el InfoDark UIButton:

- (void) showAlert { 
     UIAlertView *alert = 
     [[UIAlertView alloc] initWithTitle:@"My App" 
            message: @"Welcome to ******. \n\nSome Message........" 
            delegate:nil 
          cancelButtonTitle:@"Dismiss" 
          otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
} 

gracias por cualquier ayuda.

Respuesta

5

Ok tiene dos problemas. uno es el tema de selección como se ha dicho, pero el verdadero problema es:

[alertButton addTarget:self.tableView 
       action:@selector(showAlert:) 
     forControlEvents:UIControlEventTouchUpInside]; 

Este es el objetivo equivocado, a menos que haya una subclase UITableView para responder a la alerta.

que desea cambiar ese código para:

[alertButton addTarget:self 
       action:@selector(showAlert) 
     forControlEvents:UIControlEventTouchUpInside]; 
+0

eso es lo que era. gracias por tu respuesta. – hanumanDev

5

El motivo de Crash: su prototipo de función showAlert debe ser - (void) showAlert:(id) sender.

Uso continuación Código

- (void) showAlert:(id) sender { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My App" message: @"Welcome to ******. \n\nSome Message........" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
} 

Como dice Jacob Relkin en su respuesta here:

porque ha incluido dos puntos (:) en su argumento selector para addTarget, el selector receptor estará obligado a acepta un parámetro . El tiempo de ejecución no reconoce el selector @selector (buttonTouched :), porque no hay un método con ese nombre que acepte un parámetro. Cambie la firma del método para aceptar un parámetro del tipo id para resolver este problema.

+0

que cambió el método showAlert a showAlert: (id) del remitente. ¿la acción: @selector (showAlert :) cambia en absoluto? gracias – hanumanDev

+0

@hanumanDev: Cambie solo para mostrarAlerta: (id) remitente, deje su acción en el método como lo hace (No cambie la acción: @selector (showAlert :)). – Jhaliya

+0

Lo hice, solo cambiando el remitente showAlert: (id) (en los archivos .h y .m) pero aún falla. – hanumanDev

3

Jhaliya es correcto, pero he aquí una breve explicación de por qué.

Cuando configuró el objetivo del botón, se define el selector de la siguiente manera:

@selector(showAlert:) 

Los dos puntos (:) establece una firma de método para el selector que requiere un argumento. Sin embargo, su método se definió como -showAlert, sin tomar ningún argumento, por lo que su objeto no implementó realmente el método que indicó al UIButton para invocar. Redefiniendo el método que se muestra por Jhaliya funcionará, como el cambio de selección de su blanco botón para:

@selector(showAlert) 
+1

gracias por su explicación. Probé el @selector (showAlert) y aún se bloquea con un error de selector no reconocido. Debo estar haciendo algo diferente, tal vez. – hanumanDev

Cuestiones relacionadas