Obtenga el valor de entrada de TextField en la alerta de iOS en Swift


121

Estoy tratando de crear un mensaje de alerta con entrada y luego obtener el valor de la entrada. Encontré muchos buenos tutoriales sobre cómo hacer el campo de entrada de texto. pero no puedo obtener el valor de la alerta.


¿Una alerta de acción en iOS?
Andy Ibanez

@AndyIbanez ¡Sí, eso no lo mencioné!
ntoonio

Respuestas:


334

Actualizado para Swift 3 y superior:

//1. Create the alert controller.
let alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .alert)

//2. Add the text field. You can configure it however you need.
alert.addTextField { (textField) in
    textField.text = "Some default text"
}

// 3. Grab the value from the text field, and print it when the user clicks OK.
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in
    let textField = alert.textFields![0] // Force unwrapping because we know it exists.
    print("Text field: \(textField.text)")
}))

// 4. Present the alert.
self.present(alert, animated: true, completion: nil)

Swift 2.x

Suponiendo que desea una alerta de acción en iOS:

//1. Create the alert controller.            
var alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .Alert)

//2. Add the text field. You can configure it however you need.
alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
    textField.text = "Some default text."
})

//3. Grab the value from the text field, and print it when the user clicks OK. 
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { [weak alert] (action) -> Void in
    let textField = alert.textFields![0] as UITextField
    println("Text field: \(textField.text)")
}))

// 4. Present the alert.
self.presentViewController(alert, animated: true, completion: nil)

No es un problema. Recuerde marcar esto como Aceptado si le ayudó. ¡Gracias!
Andy Ibanez

Hola @AndyIbanez Estoy tratando de implementar su código en mi aplicación, sin embargo, se indica el error "Uso de var de identificador no declarado" Soy nuevo en Xcode, así que disculpas si se trata de un error básico en mi nombre
Sjharrison

@Sjharrison Mi código es para Swift. La única razón por la que puedo pensar que le causaría problemas con la varpalabra clave es si estuviera escribiendo en Objective-C.
Andy Ibanez

1
¿Alguien puede explicar por qué [weak alert]? Estoy mirando a Swift 3.
Andrej

3
Para la alerta Swift 3 en el paso 3. es opcional, se necesita "?" let textField = alert?.textFields![0] // Force unwrapping because we know it exists. print("Text field: \(textField?.text)")
James

27

Rápido 3/4

Puede usar la siguiente extensión para su conveniencia.

Uso dentro de un ViewController:

showInputDialog(title: "Add number",
                subtitle: "Please enter the new number below.",
                actionTitle: "Add",
                cancelTitle: "Cancel",
                inputPlaceholder: "New number",
                inputKeyboardType: .numberPad)
{ (input:String?) in
    print("The new number is \(input ?? "")")
}

El código de extensión:

extension UIViewController {
    func showInputDialog(title:String? = nil,
                         subtitle:String? = nil,
                         actionTitle:String? = "Add",
                         cancelTitle:String? = "Cancel",
                         inputPlaceholder:String? = nil,
                         inputKeyboardType:UIKeyboardType = UIKeyboardType.default,
                         cancelHandler: ((UIAlertAction) -> Swift.Void)? = nil,
                         actionHandler: ((_ text: String?) -> Void)? = nil) {

        let alert = UIAlertController(title: title, message: subtitle, preferredStyle: .alert)
        alert.addTextField { (textField:UITextField) in
            textField.placeholder = inputPlaceholder
            textField.keyboardType = inputKeyboardType
        }
        alert.addAction(UIAlertAction(title: actionTitle, style: .default, handler: { (action:UIAlertAction) in
            guard let textField =  alert.textFields?.first else {
                actionHandler?(nil)
                return
            }
            actionHandler?(textField.text)
        }))
        alert.addAction(UIAlertAction(title: cancelTitle, style: .cancel, handler: cancelHandler))

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

solo tenga en cuenta que si va a presentar la acción "Agregar" asegúrese de que el estilo sea "predeterminado" no "destructivo" - alert.addAction (UIAlertAction (title: actionTitle, style: .default ...
Bishal Ghimire

13

En Swift5 y Xcode 10

Agregue dos campos de texto con las acciones Guardar y Cancelar y lea datos de texto de TextFields

func alertWithTF() {
    //Step : 1
    let alert = UIAlertController(title: "Great Title", message: "Please input something", preferredStyle: UIAlertController.Style.alert )
    //Step : 2
    let save = UIAlertAction(title: "Save", style: .default) { (alertAction) in
        let textField = alert.textFields![0] as UITextField
        let textField2 = alert.textFields![1] as UITextField
        if textField.text != "" {
            //Read TextFields text data
            print(textField.text!)
            print("TF 1 : \(textField.text!)")
        } else {
            print("TF 1 is Empty...")
        }

        if textField2.text != "" {
            print(textField2.text!)
            print("TF 2 : \(textField2.text!)")
        } else {
            print("TF 2 is Empty...")
        }
    }

    //Step : 3
    //For first TF
    alert.addTextField { (textField) in
        textField.placeholder = "Enter your first name"
        textField.textColor = .red
    }
    //For second TF
    alert.addTextField { (textField) in
        textField.placeholder = "Enter your last name"
        textField.textColor = .blue
    }

    //Step : 4
    alert.addAction(save)
    //Cancel action
    let cancel = UIAlertAction(title: "Cancel", style: .default) { (alertAction) in }
    alert.addAction(cancel)
    //OR single line action
    //alert.addAction(UIAlertAction(title: "Cancel", style: .default) { (alertAction) in })

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

}

Para obtener más explicación https://medium.com/@chan.henryk/alert-controller-with-text-field-in-swift-3-bda7ac06026c

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.