web-dev-qa-db-fra.com

swift - validation de UITextField

j'ai ces points de vente dans mon application:

@IBOutlet var name1: UITextField!

@IBOutlet var name2: UITextField!

@IBOutlet var name3: UITextField!

@IBOutlet var name4: UITextField!

@IBOutlet var newButton: UIButton!

Ce que j'ai essayé de faire est la suivante: 

Chaque fois que l'utilisateur tape quelque chose dans l'un de ces quatre champs de texte ou supprime quelque chose, je veux vérifier si un champ de texte est vide

Si un champ de texte est vide, le bouton doit être désactivé.

Si tous les champs de texte sont définis (non vides), le bouton doit être activé.

Mon code:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    setButton()

    return true
}

func setButton() {

    let inputValid = checkInput()

    if inputValid {

        newButton.enabled = true

    } else {

        newButton.enabled = false

    }

}

func checkInput() -> Bool {

    let name1Value = name1.text
    let name2Value = name2.text
    let name3Value = name3.text
    let name4Value = name4.text

    if !name1Value.isEmpty && !name2Value.isEmpty && !name3Value.isEmpty && !name4Value.isEmpty {

        return true

    }

    return false

}

Ok, ça marche à 50% pour le moment.

Lorsque je tape un caractère dans chaque champ de texte, le bouton est toujours désactivé.

Quand j'ajoute un deuxième à un champ de texte, le bouton est activé, etc.

Quelqu'un pourrait m'aider avec ça?

Salutations et merci!

5
Creative crypter

Alternativement, vous pouvez utiliser ceci, qui est appelé chaque fois qu'une touche est enfoncée:

name1.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name2.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name3.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name4.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)


func textFieldDidChange(textField: UITextField) {
    if name1.text?.isEmpty || name2.text?.isEmpty || name3.text?.isEmpty || name4.text?.isEmpty {
        //Disable button
    } else {
        //Enable button
    }
}
12
brimstone

Swift 4 - Voici comment j'ai résolu le problème en essayant d'éviter les conditionnels longs - Cela vous permettra également d'effectuer une validation en temps réel sur chaque champ de texte, contrairement à la réponse acceptée. pouvez mettre à jour votre interface utilisateur en fonction de ce que l'utilisateur tape. 

let textfields : [UITextField] = [name1, name2, name3, name4]
for textfield in textfields {
  textfield.addtarget(self, #selector(textFieldDidChange(_:), forControlEvents: .EditingChanged)
}


func textFieldDidChange(_ textField: UITextField) {
  //set Button to false whenever they begin editing
  yourButton.isEnabled = false
  guard let first = textFields[0].text, first != "" else {
        print("textField 1 is empty")
        return
    }
    guard let second = textFields[1].text, second != "" else {
        print("textField 2 is empty")
        return
    }
    guard let third = textFields[2].text, third != "" else {
        print("textField 3 is empty")
        return
    }
    guard let forth = textFields[3].text, forth != "" else {
        print("textField 4 is empty")
        return
    }
    // set button to true whenever all textfield criteria is met.
    yourButton.isEnabled = true

}
2
A. Welch

Essayez ce code. J'espère que vous saurez quoi faire.

func updateSaveButtonState() {
    let text = titleTextField.text ?? ""
    saveButton.isEnabled = !text.isEmpty
}


@IBAction func textEditingChanged(_ sender: UITextField) {
    updateSaveButtonState()
}

@IBAction func returnPressed(_ sender: UITextField) {
    titleTextField.resignFirstResponder()
}
0
Vitalik Kizlov

La méthode textField: shouldChangeCharactersInRange: est appelée AVANT que le contenu du champ de texte ait changé. 

Vous devez mettre en casse le champ de texte actuel et déterminer si son nouveau contenu sera vide après la modification.

Quelque chose comme ça:

textField.text.length > range.length - replacementString.length

(Cela ne me vient pas à l'esprit et ne fait pas l'objet d'un débogage. De plus, vous devrez créer une logique garantissant que tous les autres champs sont non vides et utilisez la logique ci-dessus pour tester le contenu du champ actuel.)

0
Duncan C

Jetez un coup d'oeil à UITextFieldValidator . J'ai créé un validateur qui couvre presque chaque validation requise dans une application. Aussi son à Swift. Alors allez-y et vérifiez-le.

0
iAnurag