J'ai une validation de prénom à faire dans swift4 qui est dans un UITextField
. Le fait est que:
Actuellement, j'ai la validation suivante dans le UITextField
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" switch textField { case firstName: print("firstname") if string == " " { return false } else { let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted let filtered = string.components(separatedBy: cs).joined(separator: "") return (string == filtered) } } return true }
Toute idée de comment implémenter les conditions suivantes. En ce moment, je désactive l'espace et n'accepte que les alphabets.
Toute aide sera très appréciée
3 Réponses :
Vous pouvez utiliser regex pour valider le prénom avec vos conditions.
Je ne suis pas un expert en regex, mais ici vous pouvez voir un exemple
if string.count > 7 && string.count < 18 { //String valid }
Cette expression régulière vous renverra des correspondances complètes. Vous pouvez vérifier si la chaîne renvoyée est valide.
Lien avec un exemple de regex d'utilisation dans Swift.
Nombre de caractères de chaîne que vous pouvez vérifier en utilisant Swift, comme:
^[a-zA-Z](?:[a-zA-Z\.\s][^\n]*)[a-zA-Z]$
Vous pouvez vérifier les deux conditions lorsque vous prenez la valeur de UITextField
qui sont:
Et les conditions de repos peuvent être faites dans shouldChangeCharactersInRange
comme ci-dessous:
//Trimming whitespaces at the end let firstname = firstName.text?.trimmingCharacters(in: .whitespaces) let letters = NSCharacterSet.letters let prefix = String((firstname?.first)!) let suffix = String((firstname?.last)!) //Checking if First Character is letter if let _ = prefix.rangeOfCharacter(from: letters) { print("letters found") } else { print("letters not found") } //Checking if Last Character is letter if let _ = suffix.rangeOfCharacter(from: letters) { print("letters found") } else { print("letters not found") }
Pour vérifier le nombre minimum de lettres, rognage espaces à la fin et commençant et se terminant par une lettre avec les conditions ci-dessous à l'intérieur d'un clic sur un bouton ou quelque chose d'équivalent:
let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. " switch textField { case firstName: print("firstname") //Condition for always accepting backcspaces if string == "" { return true } //Condition for restricting space at the begining else if textField.text?.count == 0 && string == " " { return false } //Condition for restricing user from entering more than 18 letters else if (textField.text?.count)! > 17 { return false } //Condition for only accepting the alphabets. else { let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted let filtered = string.components(separatedBy: cs).joined(separator: "") return (string == filtered) }
J'espère que cela vous aidera.
ça sonne bien mais je voudrais valider quand l'utilisateur arrête l'édition et passe au prochain uitextfield. Comment y parvenir?
Faites cela dans didEndEditing alors!
Vous pouvez utiliser cette fonction pour une manière courte et propre
(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$
Cas de test
isValid(testStr: " MyNameIsDahiya") // Invalid, leading space isValid(testStr: "MyNameIsDahiya ") // Invalid, trailing space isValid(testStr: " MyNameIsDahiya ") // Invalid, leading & trailing space isValid(testStr: "1MyNameIsDahiya") // Invalid, Leading num isValid(testStr: "MyNameIsDahiya1") // Invalid, trailing num isValid(testStr: "1MyNameIsDahiya1") // Invalid, leading & trailing num isValid(testStr: "MyName") // Invalid, length below 7 isValid(testStr: "MyNameIsDahiyaBlahhblahh") // Invalid, length above 18 isValid(testStr: "MyNameIsDahiya") // Valid, isValid(testStr: "Mr. Dahiya") // Valid,
Test du terrain de jeu
Modifier
Essayez ceci ci-dessous regex:
func isValid(testStr:String) -> Bool { guard testStr.count > 7, testStr.count < 18 else { return false } let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$") return predicateTest.evaluate(with: testStr) }
Cela validera également toutes les conditions et la longueur.
"Mr Dahiya" sera-t-il valide?
@ElizabethMoly Ouais, cochez la dernière option.
Merci beaucoup. est-il possible d'accepter un seul espace entre eux? car "mr (6 espaces entre les deux) y" est également accepté
Merci beaucoup, je vais vérifier et vous faire savoir
Pourriez-vous s'il vous plaît penser également aux noms non anglais qui contiennent d'autres caractères? Par exemple
"María"
ou"François"
? Les caractèresa-z
ne sont pas les seules lettres qui existent. Je ne dis pas comment votre validation échouera pour le nom asiatique. Mon prénom est encore plus court que 7 caractères.