2010-12-30 18 views
17

Estoy tratando de obtener texto de una vista de alerta y agregarlo a mi matriz mutable para listar en una vista de tabla. Me doy cuenta de que hay una pregunta similar que se publicó hace unos meses, pero no entiendo cómo utilizar la respuesta dada.Obtener texto de UIAlertView

-(IBAction)insert { 
    UIAlertView* dialog = [[UIAlertView alloc] init]; 
    [dialog setDelegate:self]; 
    [dialog setTitle:@"Enter Name"]; 
    [dialog setMessage:@" "]; 
    [dialog addButtonWithTitle:@"Cancel"]; 
    [dialog addButtonWithTitle:@"OK"]; 

    UITextField *nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)]; 
    [nameField setBackgroundColor:[UIColor whiteColor]]; 
    [dialog addSubview:nameField]; 
    [dialog show]; 

    [data addObject:[nameField text]]; 
    [mainTableView reloadData]; 

Sin embargo mi aplicación se bloquea porque dice que estoy tratando de insertar un objeto nulo en el índice 0. ¿Qué estoy haciendo mal?

EDIT: Ok, creo que me falta un método para manejar la alerta. Así que encontré esto:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex]; 
    if([buttonTitle isEqualToString:@"Cancel"]) { 
     return; 
    } 
    else if([buttonTitle isEqualToString:@"Ok"]) { 
     [data addObject:nameField.text]; 

    } 

Ahora solo necesito conectar las piezas, pero no estoy seguro de cómo.

Respuesta

45

Un error común que las personas cometen al usar un UIAlertView es que piensan que al enviarlo un mensaje show se bloqueará el hilo principal. No es asi. Su código continúa ejecutándose, aunque haya una alerta en la pantalla. Por lo tanto, no existe ningún valor para el UITextField que ha pasado en.

Lo que hay que hacer es poner en práctica el UIAlertViewDelegate en su UIViewController para agarrar todo lo que un usuario ha entrado en el campo de texto. Dicho esto, aún debe verificar el valor nil, porque si no escribe nada, el valor text será nil.

ACTUALIZACIÓN: Esta respuesta se publicó antes de que Apple creara una API para agregar un UITextField a una alerta a través del UIAlertViewStyle. Aquí está el código actualizado, tomado de @ Matt

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Luego, en la llamada UIAlertViewDelegate vuelta:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // Insert whatever needs to be done with "name" 
    } 
} 
+0

Mi aplicación es una aplicación basada en la ventana. ¿Esto importa? – Snowman

+0

@ f-Prime No, no importa. Estamos atravesando la jerarquía de UIAlertView. –

+0

Ok, ¿cómo debería ser mi código completo? ¿Mi método add más tu método clickedButtonAtIndex y debería funcionar? ¿Debo llamar a clickedButtonAtIndex en mi método de agregar? Cuz como está ahora, no está funcionando – Snowman

0

– alertView:clickedButtonAtIndex: es un método delegado de UIAlertView. Simplemente agregue el método que definió en su edición a la implementación de su controlador y debería estar listo, ya que ya configuró el controlador para que sea el delegado de AlertView.

también se suman a la cabecera de la clase, para evitar cualquier advertencia relacionada con delegados, es decir:

@interface MyViewController : UIViewController <UIAlertViewDelegate> { 
... 
}; 

No se olvide de quitar [data addObject:[nameField text]]; y [mainTableView reloadData]; a partir del método de inserción.

+0

Ok, lo hice, pero recibo un error de "nombre de campo no declarado" en el método clickedButtonAtIndex – Snowman

0
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert title" 
                message:@"alert message" 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Ok", nil]; 
[myAlert addTextFieldWithValue:nil label:@"<place holder>"]; 
[[myAlert textField] setTextAlignment:UITextAlignmentCenter]; 
[[myAlert textField] becomeFirstResponder]; 
[myAlert show]; 
[myAlert release]; 
myAlert = nil;    

hay necesidad de añadir un campo de texto personalizado. Puede agregar directamente usando el método addTextFieldWithValue.

+0

UIAlertView no parece tener un método 'addTextFieldWithValue: label:' –

3

No intente agregar un UITextView en un UIAlertView o Apple podría rechazar su aplicación.

Ya usé el mismo tipo de funcionalidad en mi aplicación. Pero Apple RECHAZO MI APLICACIÓN debido al uso de UITextView en UIAlertView.

27

No es necesario añadir su campo de texto al AlertView sino establecer el estilo apropiado

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Luego acceder al texto introducido después en OK (botón 1) fue presionado

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // name contains the entered value 
    } 
} 
+0

Nota: solo funciona en iOS5 + –