solo espera unos meses, hasta aproximadamente septiembre, y tu vida será mucho más fácil.
Jonathan.
Respuestas:
264
En iOS 5 hay una forma nueva y fácil de hacerlo. No estoy seguro de si la implementación está completamente completa todavía, ya que no es tan elegante como, digamos, a UITableViewCell, pero definitivamente debería funcionar, ya que ahora es compatible con la API de iOS. No necesitará una API privada para esto.
UIAlertView* alert =[[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!"delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle =UIAlertViewStylePlainTextInput;[alert show];[alert release];
Esto genera una vista de alerta como esta (captura de pantalla tomada del simulador de iPhone 5.0 en XCode 4.2):
Al presionar cualquier botón, se llamará a los métodos de delegado regulares y puede extraer la entrada de texto allí de la siguiente manera:
Aquí acabo de NSLog los resultados que se ingresaron. En el código de producción, probablemente debería mantener un puntero a su alertView como una variable global o usar la etiqueta alertView para verificar si la función delegada fue llamada por el apropiado, UIAlertViewpero para este ejemplo esto debería estar bien.
Deberías consultar la API UIAlertView y verá que hay más estilos definidos.
Espero que esto haya ayudado!
- EDITAR -
Estaba jugando un poco con el alertView y supongo que no necesita ningún anuncio de que es perfectamente posible editar el textField como se desee: puede crear una referencia al UITextFieldy editarlo de manera normal (mediante programación). Al hacer esto, construí un alertView como especificó en su pregunta original. Mejor tarde que nunca, cierto :-)?
UIAlertView* alert =[[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:"delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle =UIAlertViewStylePlainTextInput;UITextField* alertTextField =[alert textFieldAtIndex:0];
alertTextField.keyboardType =UIKeyboardTypeNumberPad;
alertTextField.placeholder =@"Enter your name";[alert show];[alert release];
Esto produce esta alerta:
Puede usar el mismo método de delegado que el póster anterior para procesar el resultado de la entrada. Sin UIAlertViewembargo, no estoy seguro de si puede evitar que se descarte (no hay una shouldDismissfunción de delegado AFAIK), así que supongo que si la entrada del usuario no es válida, debe colocar una nueva alerta (o simplemente volvershow esta) hasta que la entrada correcta sea ingresó.
Para asegurarse de recibir las devoluciones de llamadas después de que el usuario ingrese el texto, configure el delegado dentro del controlador de configuración. textField.delegate = self
Swift 3 y 4 (iOS 10-11):
let alert =UIAlertController(title:"Alert", message:"Message", preferredStyle:UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title:"Click", style:UIAlertActionStyle.default, handler:nil))
alert.addTextField(configurationHandler:{(textField:UITextField!)in
textField.placeholder ="Enter text:"
textField.isSecureTextEntry =true// for password input})self.present(alert, animated:true, completion:nil)
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {NSString* detailString = textField.text;NSLog(@"String is: %@", detailString);//Put it on the debuggerif([textField.text length]<=0|| buttonIndex ==0){return;//If cancel or 0 length string the string doesn't matter}if(buttonIndex ==1){...}}
Tuve algo como esto desde IOS 4, pero parece que se rompió en OS 7. Ahora use el código de Wakrst: guarde muchas líneas de código.
Dave Appleton
Entonces, ¿cuál sería la forma correcta de hacer esto para iOS7? Estamos construyendo con iOS6 SDK pero todavía se muestra raro en iOS7.
sebrock
Se agregó soporte para iOS7 a la pregunta
John Riselvato el
1
Encontré que tenía que poner lo siguiente en mi alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexmétodo de delegado para obtener el valor del textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih el
1
reemplace "var alert" con "let alert" en el código swift para cumplir con la última versión de swift
Matei Suica
11
Probé el tercer fragmento de código de Warkst: funcionó muy bien, excepto que lo cambié para que sea el tipo de entrada predeterminado en lugar de numérico:
UIAlertView* alert =[[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:"delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle =UIAlertViewStylePlainTextInput;UITextField* alertTextField =[alert textFieldAtIndex:0];
alertTextField.keyboardType =UIKeyboardTypeDefault;
alertTextField.placeholder =@"Enter your name";[alert show];
¡Buen punto! Estaba jugando con el textField en ese momento y olvidé cambiar el tipo de teclado antes de cargar el fragmento de código. ¡Me alegra que mi código pueda ayudarte!
Warkst
11
Desde IOS 9.0 usa UIAlertController:
UIAlertController* alert =[UIAlertController alertControllerWithTitle:@"My Alert"
message:@"This is an alert."
preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* defaultAction =[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction* action){//use alert.textFields[0].text}];UIAlertAction* cancelAction =[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
handler:^(UIAlertAction* action){//cancel action}];[alert addTextFieldWithConfigurationHandler:^(UITextField*_Nonnull textField){// A block for configuring the text field prior to displaying the alert}];[alert addAction:defaultAction];[alert addAction:cancelAction];[self presentViewController:alert animated:YES completion:nil];
Solo quería agregar una información importante que creo que se omitió tal vez con la suposición de que los que buscan respuestas podrían saberlo. Este problema ocurre mucho y yo también me quedé atrapado cuando intenté implementar el viewAlertmétodo para los botonesUIAlertView mensaje. Para hacer esto, primero debe agregar la clase delegada que puede verse así:
func doAlertControllerDemo(){var inputTextField:UITextField?;let passwordPrompt =UIAlertController(title:"Enter Password", message:"You have selected to enter your passwod.", preferredStyle:UIAlertControllerStyle.Alert);
passwordPrompt.addAction(UIAlertAction(title:"OK", style:UIAlertActionStyle.Default, handler:{(action)->Voidin// Now do whatever you want with inputTextField (remember to unwrap the optional)let entryStr :String=(inputTextField?.text)!;print("BOOM! I received '\(entryStr)'");self.doAlertViewDemo();//do again!}));
passwordPrompt.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.Default, handler:{(action)->Voidinprint("done");}));
passwordPrompt.addTextFieldWithConfigurationHandler({(textField:UITextField!)in
textField.placeholder ="Password"
textField.secureTextEntry =false/* true here for pswd entry */
inputTextField = textField
});self.presentViewController(passwordPrompt, animated:true, completion:nil);return;}
Intenté un código similar y muestra la vista de alerta con cuadro de texto y botones, pero no hay suficiente espacio para el campo de texto, está atascado entre el título y los botones y los toca a ambos. Intenté algunas transformaciones para escalar el marco, pero los botones permanecen donde estaban, por lo que también deben moverse. No sé cómo reposicionar los botones y no puedo creer que todo esto sea necesario para recuperar una sola línea de texto de un aviso al usuario. ¿No hay una mejor manera que esta?
Dean Davids
2
Agregue vistas a un UIAlertView como este . En iOS 5 hay algunas cosas "mágicas" que lo hacen por usted (pero todo eso está bajo NDA).
Intenté esto y funciona un poco. Excepto que la ventana emergente está fuera de la pantalla (la mitad superior de la ventana emergente está cortada). Alguna idea de por qué?
user605957
Tuve el mismo problema, al eliminar setTranformMakeTranslation (0,109) me lo arregló tanto en ipad como en iphone. Apareció en el lugar correcto sin él.
joeld
2
En Xamarin y C #:
var alert =newUIAlertView("Your title","Your description",null,"Cancel",new[]{"OK"});
alert.AlertViewStyle=UIAlertViewStyle.PlainTextInput;
alert.Clicked+=(s, b)=>{var title = alert.ButtonTitle(b.ButtonIndex);if(title =="OK"){var text = alert.GetTextField(0).Text;...}};
alert.Show();
Sobre la base de la respuesta de John Riselvato, para recuperar la cadena desde el UIAlertView ...
alert.addAction(UIAlertAction(title:"Submit", style:UIAlertAction.Style.default){(action :UIAlertAction)in
guard let message = alert.textFields?.first?.text else{return}// Text Field Response Handling Here})
Respuestas:
En iOS 5 hay una forma nueva y fácil de hacerlo. No estoy seguro de si la implementación está completamente completa todavía, ya que no es tan elegante como, digamos, a
UITableViewCell
, pero definitivamente debería funcionar, ya que ahora es compatible con la API de iOS. No necesitará una API privada para esto.Esto genera una vista de alerta como esta (captura de pantalla tomada del simulador de iPhone 5.0 en XCode 4.2):
Al presionar cualquier botón, se llamará a los métodos de delegado regulares y puede extraer la entrada de texto allí de la siguiente manera:
Aquí acabo de NSLog los resultados que se ingresaron. En el código de producción, probablemente debería mantener un puntero a su alertView como una variable global o usar la etiqueta alertView para verificar si la función delegada fue llamada por el apropiado,
UIAlertView
pero para este ejemplo esto debería estar bien.Deberías consultar la API UIAlertView y verá que hay más estilos definidos.
Espero que esto haya ayudado!
- EDITAR -
Estaba jugando un poco con el alertView y supongo que no necesita ningún anuncio de que es perfectamente posible editar el textField como se desee: puede crear una referencia al
UITextField
y editarlo de manera normal (mediante programación). Al hacer esto, construí un alertView como especificó en su pregunta original. Mejor tarde que nunca, cierto :-)?Esto produce esta alerta:
Puede usar el mismo método de delegado que el póster anterior para procesar el resultado de la entrada. Sin
UIAlertView
embargo, no estoy seguro de si puede evitar que se descarte (no hay unashouldDismiss
función de delegado AFAIK), así que supongo que si la entrada del usuario no es válida, debe colocar una nueva alerta (o simplemente volvershow
esta) hasta que la entrada correcta sea ingresó.¡Que te diviertas!
fuente
Para asegurarse de recibir las devoluciones de llamadas después de que el usuario ingrese el texto, configure el delegado dentro del controlador de configuración.
textField.delegate = self
Swift 3 y 4 (iOS 10-11):
En Swift (iOS 8-10):
En Objective-C (iOS 8):
PARA iOS 5-7:
NOTA: a continuación no funciona con iOS 7 (iOS 4 - 6 funciona)
Solo para agregar otra versión.
entonces llamo
[alert show];
cuando lo quiero.El método que acompaña
fuente
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
método de delegado para obtener el valor del textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`Probé el tercer fragmento de código de Warkst: funcionó muy bien, excepto que lo cambié para que sea el tipo de entrada predeterminado en lugar de numérico:
fuente
Desde IOS 9.0 usa UIAlertController:
fuente
Solo quería agregar una información importante que creo que se omitió tal vez con la suposición de que los que buscan respuestas podrían saberlo. Este problema ocurre mucho y yo también me quedé atrapado cuando intenté implementar el
viewAlert
método para los botonesUIAlertView
mensaje. Para hacer esto, primero debe agregar la clase delegada que puede verse así:@interface YourViewController : UIViewController <UIAlertViewDelegate>
También puedes encontrar un tutorial muy útil aquí !
Espero que esto ayude.
fuente
Pruebe este código Swift en un UIViewController:
fuente
Swift 3:
fuente
Yo usaría un
UIAlertView
con unaUITextField
subvista. Puede agregar el campo de texto manualmente o, en iOS 5, usar uno de los nuevos métodos.fuente
code
UIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle: @ "Su título aquí" mensaje: @ "esto se cubre" delegado: self cancelButtonTitle: @ "Cancel" otherButtonTitles: @ "OK", nil]; UITextField * myTextField = [[UITextField alloc] initWithFrame: CGRectMake (12.0, 45.0, 260.0, 25.0)]; CGAffineTransform myTransform = CGAffineTransformMakeTranslation (0.0, 130.0); [myAlertView setTransform: myTransform]; [myTextField setBackgroundColor: [UIColor whiteColor]]; [myAlertView addSubview: myTextField]; [espectáculo myAlertView]; [versión de myAlertView];Agregue vistas a un UIAlertView como este . En iOS 5 hay algunas cosas "mágicas" que lo hacen por usted (pero todo eso está bajo NDA).
fuente
En Xamarin y C #:
fuente
Sobre la base de la respuesta de John Riselvato, para recuperar la cadena desde el UIAlertView ...
fuente
fuente