¿Cuál es una manera simple de obtener un cuadro de diálogo emergente de entrada de texto en un iPhone


125

Quiero obtener el nombre de usuario. Un cuadro de diálogo de entrada de texto simple. ¿Alguna forma simple de hacer esto?


1
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):

alerta de ejemplo con alertViewStyle establecido en UIAlertViewStylePlainTextInput

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:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}

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:

UIAlertView que usa UIAlertViewPlainTextInput alertStyle para pedir un nombre de usuario

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ó.

¡Que te diviertas!


1
Con el conteo automático de referencias, ya no se supone que retenga y libere objetos usted mismo.
Waqleh

55
Lo sé, pero esta respuesta fue escrita en 2011.
Warkst

3
El método se deprecia desde IOS 9.0. Utilice en su lugar UIAlertController:
EckhardN

Si está buscando soporte con Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato el

186

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)

En Swift (iOS 8-10):

ingrese la descripción de la imagen aquí

override func viewDidAppear(animated: Bool) {
    var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Enter text:"
        textField.secureTextEntry = true
        })
    self.presentViewController(alert, animated: true, completion: nil)
}

En Objective-C (iOS 8):

- (void) viewDidLoad 
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"Enter text:";
        textField.secureTextEntry = YES;
    }];
    [self presentViewController:alert animated:YES completion:nil];
}

PARA iOS 5-7:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

ingrese la descripción de la imagen aquí


NOTA: a continuación no funciona con iOS 7 (iOS 4 - 6 funciona)

Solo para agregar otra versión.

UIAlert con UITextField

- (void)viewDidLoad{

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    UITextField *textField = [[UITextField alloc] init];
    [textField setBackgroundColor:[UIColor whiteColor]];
    textField.delegate = self;
    textField.borderStyle = UITextBorderStyleLine;
    textField.frame = CGRectMake(15, 75, 255, 30);
    textField.placeholder = @"Preset Name";
    textField.keyboardAppearance = UIKeyboardAppearanceAlert;
    [textField becomeFirstResponder];
    [alert addSubview:textField];

}

entonces llamo [alert show];cuando lo quiero.

El método que acompaña

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         
    NSString* detailString = textField.text;
    NSLog(@"String is: %@", detailString); //Put it on the debugger
    if ([textField.text length] <= 0 || buttonIndex == 0){ 
        return; //If cancel or 0 length string the string doesn't matter
    }
    if (buttonIndex == 1) {
        ...

    }
}


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];

5

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í:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

También puedes encontrar un tutorial muy útil aquí !

Espero que esto ayude.


5

Pruebe este código Swift en un UIViewController:

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) -> Void in
        // 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) -> Void in
        print("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;
}

3

Swift 3:

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:"
})

self.present(alert, animated: true, completion: nil)

2

Yo usaría un UIAlertViewcon una UITextFieldsubvista. Puede agregar el campo de texto manualmente o, en iOS 5, usar uno de los nuevos métodos.


Agregué el siguiente código de otra publicación, pero la ventana emergente aparece en la pantalla (muy arriba, con solo la mitad inferior visible)
user605957

2
codeUIAlertView * 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];
user605957

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 = new UIAlertView ("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();

0

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
        })

-1
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";

UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";

UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];

lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];

[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];

username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;

[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];

[alt show];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.