1
votes

Comment avoir une validation de prénom dans iOS Swift 4?

J'ai une validation de prénom à faire dans swift4 qui est dans un UITextField . Le fait est que:

  1. Le prénom doit commencer par une lettre et se terminer par une lettre,
  2. Aucun espace blanc de fin et de début.
  3. Il peut avoir des espaces entre eux, peut contenir des points.
  4. doit comporter entre 7 et 18 caractères.

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


1 commentaires

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ères a-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.


3 Réponses :


1
votes

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


0 commentaires

1
votes

Vous pouvez vérifier les deux conditions lorsque vous prenez la valeur de UITextField qui sont:

  1. Le prénom doit commencer et se terminer par une lettre
  2. Rognage des espaces à la fin.

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.


2 commentaires

ç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!



3
votes

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

 entrez la description de l'image ici

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.


4 commentaires

"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