Obtenir la valeur d'entrée de TextField dans l'alerte iOS dans Swift

121

J'essaie de créer un message d'alerte avec une entrée, puis d'obtenir la valeur de l'entrée. J'ai trouvé de nombreux bons tutoriels sur la façon de créer le champ de texte de saisie. mais je ne peux pas obtenir la valeur de l'alerte.

ntoonio
la source
Une alerte d'action sur iOS?
Andy Ibanez
@AndyIbanez Oui, je n'ai pas mentionné ça!
ntoonio

Réponses:

334

Mis à jour pour Swift 3 et supérieur:

//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

En supposant que vous vouliez une alerte d'action sur 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)
Andy Ibanez
la source
Pas de problème. N'oubliez pas de marquer ceci comme Accepté si cela vous a aidé. Merci!
Andy Ibanez
Salut @AndyIbanez J'essaie d'implémenter votre code sur mon application, mais il indique l'erreur "Utilisation de l'identifiant non déclaré var" Je suis nouveau sur Xcode, alors excuses s'il s'agit d'une erreur de base en mon nom
Sjharrison
@Sjharrison Mon code est pour Swift. La seule raison pour laquelle je pense que cela vous causerait des problèmes avec le varmot-clé est si vous écriviez en Objective-C.
Andy Ibanez
1
Quelqu'un peut-il expliquer pourquoi le [weak alert]? Je regarde Swift 3.
Andrej
3
Pour Swift 3, l'alerte à l'étape 3. est facultative, nécessaire "?" let textField = alert?.textFields![0] // Force unwrapping because we know it exists. print("Text field: \(textField?.text)")
James
27

Swift 3/4

Vous pouvez utiliser l'extension ci-dessous pour votre commodité.

Utilisation à l'intérieur d'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 ?? "")")
}

Le code d'extension:

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)
    }
}
Gunhan
la source
notez simplement que si vous allez présenter l'action "Ajouter", assurez-vous que le style est "default" et non "destructif" - alert.addAction (UIAlertAction (title: actionTitle, style: .default ...
Bishal Ghimire
13

Dans Swift5 et Xcode 10

Ajoutez deux champs de texte avec les actions Enregistrer et Annuler et lisez les données de texte 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)

}

Pour plus d'explications https://medium.com/@chan.henryk/alert-controller-with-text-field-in-swift-3-bda7ac06026c

iOS
la source