UITextField no UIAlertView no iPhone – como torná-lo responsivo?

Coloquei um UITextField em um UIAlertView e movi-o para que o teclado não o encobrisse com o seguinte código:

[dialog setDelegate:self]; [dialog setTitle:@"Enter Name"]; [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]; CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0); [dialog setTransform: moveUp]; [dialog show]; 

Eu também tenho o seguinte código para lidar com a exibição de alerta:

 - (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{ NSLog(@"%d", (int) buttonIndex); if (buttonIndex == 1) { // OK pushed NSLog([alert textField].text); // does not log anything } else { // Cancel pushed }} 

Eu também tenho um arquivo UIAlertViewExtended.h que contém:

 @class UITextField, UILabel; @interface UIAlertView(Extended) -(UITextField *)textField; @end 

A minha pergunta é como obtenho o texto que o usuário inseriu e como descarte o teclado?

Obrigado Ben

Qualquer pessoa que suporte o iOS 5.0 em diante com o ARC, existe essa propriedade alertViewStyle direta que você pode definir:

 -(void)showAlertWithTextField{ UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil]; [dialog setAlertViewStyle:UIAlertViewStylePlainTextInput]; // Change keyboard type [[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad]; [dialog show]; } -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 1) NSLog(@"%@",[[alertView textFieldAtIndex:0]text]); } 

Para quem se importa, aqui está uma solução funcional:

 UIAlertView* dialog = [[UIAlertView alloc] init]; [dialog setDelegate:self]; [dialog setTitle:@"Enter Name"]; [dialog setMessage:@" "]; [dialog addButtonWithTitle:@"Cancel"]; [dialog addButtonWithTitle:@"OK"]; nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)]; [nameField setBackgroundColor:[UIColor whiteColor]]; [dialog addSubview:nameField]; CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0); [dialog setTransform: moveUp]; [dialog show]; [dialog release]; [nameField release]; 

Certifique-se de ter criado o UITextField * nameField; no seu arquivo .h, você pode obter o texto typescript pelo usuário: inputText = [nameField text];

no alerta – (void) Visualizar: (UIAlertView *) alerta clickedButtonAtIndex: (NSInteger) método buttonIndex.

observação importante: para o iOS 4.0+, o CGAffineTransform é feito automaticamente para que você possa deixar esse bit para fora se estiver segmentando apenas 4.0+. Caso contrário, você precisará verificar em qual sistema operacional você está e lidar com isso de acordo.

Uma maneira simples de localizar o campo de texto, sem manter uma referência explícita a ele, é definir sua tag:

 nameField.tag = ALERTVIEW_NAMEFIELD; 

Certifique-se de que é diferente de 0 e de outras tags de object do UIView você possa ter, incluindo o diálogo pai!

Em seguida, dentro do alertView:clickedButtonAtIndex: você pode recuperar seu campo de texto desta maneira:

 UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD]; 

Encontrei uma solução mais clara. Verifique este trecho de código: Nome de usuário e senha UITextFields no prompt do UIAlertView

Uma abordagem bastante interessante é que você pode usar os methods delegates do UITextFieldDelegate para mover a checkbox de diálogo apenas quando o teclado estiver ativado. Ver abaixo.

 - (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationDelegate:self]; CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20); [dialog setTransform: moveUp]; [UIView commitAnimations]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationDelegate:self]; CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0); [dialog setTransform: moveDown]; [textField resignFirstResponder]; return YES; } 

Isto é para iOS5 e ARC.

 -(void)showAlert { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album" message:@"Enter a name for the album." delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Save", nil]; alertView.alertViewStyle = UIAlertViewStylePlainTextInput; UITextField* textfield = [alertView textFieldAtIndex:0]; textfield.placeholder = @"Title"; [alertView show]; } -(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { if (buttonIndex != 1) { NSLog(@"Cancel"); return; } UITextField* textfield = [alertView textFieldAtIndex:0]; NSLog(@"Save. text: %@", textfield.text); } 

Na verdade, esta é apenas mais uma linha para o código UIAlertView regular. Espero que isto ajude!

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil]; alert.alertViewStyle = UIAlertViewStylePlainTextInput; [alert show]; [alert release]; 

só roda no iOS 5 ou posterior

Gostaria de adicionar um pequeno ajuste à resposta do iWasRobbed:

GenericAlertDialogs.m:

 + (void)displayInputDialog:(NSString*)title delegate:(id)delegate textFiled:(UITextField*)txtField { UIAlertView* dialog = [[UIAlertView alloc] init]; [dialog setDelegate:delegate]; [dialog setTitle:title]; [dialog setMessage:@" "]; [dialog addButtonWithTitle:@"Cancel"]; [dialog addButtonWithTitle:@"OK"]; if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) { txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0); } else { txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0); } [txtField becomeFirstResponder]; [txtField setBackgroundColor:[UIColor whiteColor]]; [dialog addSubview:txtField]; [dialog show]; } 

Algum outro arquivo .m (implementa UIAlertViewDelegate)

  self->txtChangeName = [[UITextField alloc] init]; [GenericAlertDialogs displayInputDialog:@"Some title...:" delegate:self textFiled:txtChangeName]; 

O tratamento do protocolo UIAlertViewDelegate:

 - (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex { if(buttonIndex == 1) { if([txtChangeName.text length] > 0) { self->userInput = [txtChangeName text]; } } self->txtChangeName = nil; } 

Compatível com iOS 4 ou superior.