Validación de contraseña en UITextField en iOS

Tengo 1 UITextfield para la contraseña en mi aplicación de iPhone.

Quiero validar este campo de texto con la siguiente validación.

  • Debe tener al menos 10 caracteres
  • Debe contener al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial
  • Los caracteres especiales válidos son – @#$%^&+=^.*(?=.{10,})(?=.*d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%^&+=]).*$

¿Cómo puedo restringir el UITextField con los requisitos anteriores?

Así es como lo haría. La validación debe hacerse al final cuando el usuario ha escrito la contraseña y no en el medio. No utilizaré NSRegularExpression .

 -(void)textFieldDidEndEditing:(UITextField *)textField{ int numberofCharacters = 0; BOOL lowerCaseLetter,upperCaseLetter,digit,specialCharacter = 0; if([textField.text length] >= 10) { for (int i = 0; i < [textfield.text length]; i++) { unichar c = [textfield.text characterAtIndex:i]; if(!lowerCaseLetter) { lowerCaseLetter = [[NSCharacterSet lowercaseLetterCharacterSet] characterIsMember:c]; } if(!upperCaseLetter) { upperCaseLetter = [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:c]; } if(!digit) { digit = [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]; } if(!specialCharacter) { specialCharacter = [[NSCharacterSet symbolCharacterSet] characterIsMember:c]; } } if(specialCharacter && digit && lowerCaseLetter && upperCaseLetter) { //do what u want } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please Ensure that you have at least one lower case letter, one upper case letter, one digit and one special character" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please Enter at least 10 password" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } 

Espero que esto ayude...

También puedes hacer esto usando Regex . Aquí hay algunos ejemplos que estoy brindando para usted:

 // *** Validation for Password *** // "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$" --> (Minimum 8 characters at least 1 Alphabet and 1 Number) // "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,16}$" --> (Minimum 8 and Maximum 16 characters at least 1 Alphabet, 1 Number and 1 Special Character) // "^(?=.*[az])(?=.*[AZ])(?=.*\\d)[a-zA-Z\\d]{8,}$" --> (Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet and 1 Number) // "^(?=.*[az])(?=.*[AZ])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}" --> (Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character) // "^(?=.*[az])(?=.*[AZ])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,10}" --> (Minimum 8 and Maximum 10 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character) 

En cuarto lugar de la lista es su caso, el siguiente fragmento de código muestra cómo usarlo:

 -(BOOL)isValidPassword:(NSString *)passwordString { NSString *stricterFilterString = @"^(?=.*[az])(?=.*[AZ])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{10,}"; NSPredicate *passwordTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stricterFilterString]; return [passwordTest evaluateWithObject:passwordString]; } 

Usando el método:

 if(![self isValidPassword:txtPassword.text]) { /* Show alert: "Password must be minimum 10 characters, at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character" */ } else { // Password is valid } 

Condición : la contraseña debe contener al menos 8 caracteres, 1 mayúscula y 1 número

Solución en Swift 3

puedes escribir String Extension así,

 extension String { func isValidPassword() -> Bool { let regularExpression = "^(?=.*[az])(?=.*[AZ])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}" let passwordValidation = NSPredicate.init(format: "SELF MATCHES %@", regularExpression) return passwordValidation.evaluate(with: self) } } //Example 1 var password = "@Abcdef011" //string from UITextField (Password) password.isValidPassword() // -> true //Example 2 var password = "Abcdef011" //string from UITextField password.isValidPassword() // -> false 

o puedes escribir una función como esta,

 func validate(password: String) -> Bool { let regularExpression = "^(?=.*[az])(?=.*[AZ])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}" let passwordValidation = NSPredicate.init(format: "SELF MATCHES %@", regularExpression) return passwordValidation.evaluate(with: password) } 

esto te dará el mismo resultado.

Puede verificar la validación de su contraseña usando la función siguiente simplemente pase una cadena de contraseña y esto le devolverá el valor BOOL.

 -(BOOL) isPasswordValid:(NSString *)pwd { NSCharacterSet *upperCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLKMNOPQRSTUVWXYZ"]; NSCharacterSet *lowerCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"]; //NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; if ( [pwd length]<6 || [pwd length]>20 ) return NO; // too long or too short NSRange rang; rang = [pwd rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]]; if ( !rang.length ) return NO; // no letter rang = [pwd rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]]; if ( !rang.length ) return NO; // no number; rang = [pwd rangeOfCharacterFromSet:upperCaseChars]; if ( !rang.length ) return NO; // no uppercase letter; rang = [pwd rangeOfCharacterFromSet:lowerCaseChars]; if ( !rang.length ) return NO; // no lowerCase Chars; return YES; } 

Swift 3

verificar si la contraseña es fuerte

  1. longitud mayor o igual a 8
  2. minúscula
  3. mayúscula
  4. dígitos decimales
  5. los caracteres especiales como! @ # $% ^ & * () _- + son opcionales

    ¿Por qué no uso la expresión regular?

    Porque es difícil admitir caracteres reservados en la syntax de expresiones regulares.


  func isValidated(_ password: String) -> Bool { var lowerCaseLetter: Bool = false var upperCaseLetter: Bool = false var digit: Bool = false var specialCharacter: Bool = false if password.characters.count >= 8 { for char in password.unicodeScalars { if !lowerCaseLetter { lowerCaseLetter = CharacterSet.lowercaseLetters.contains(char) } if !upperCaseLetter { upperCaseLetter = CharacterSet.uppercaseLetters.contains(char) } if !digit { digit = CharacterSet.decimalDigits.contains(char) } if !specialCharacter { specialCharacter = CharacterSet.punctuationCharacters.contains(char) } } if specialCharacter || (digit && lowerCaseLetter && upperCaseLetter) { //do what u want return true } else { return false } } return false } let isVaildPass:Bool = isValidated("Test**00+-") print(isVaildPass) 

use un regex (la clase NSRegularExpression tiene documentos sobre cómo escribir el patten mismo) y luego:

 - (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //delete if (string.length == 0) { return YES; } if (self.regEx) { NSMutableString* check = [NSMutableString stringWithString:theTextField.text]; [check replaceCharactersInRange:range withString:string]; NSTextCheckingResult* match = [self.regEx firstMatchInString:check options:0 range:NSMakeRange(0, [check length])]; if (match.range.length != check.length) { return NO; } } } 

Advertencia: Restringir la entrada de esta manera es realmente confuso para los usuarios. ¡Escribes y escribes y el personaje que escribes simplemente no aparece!

¡Tal vez vaya con un pequeño color rojo (!) Al lado del campo de prueba, pero siempre permitiré la entrada en sí misma!

Tengo esta elegante solución para Formularios (como registro) donde tienes mucha validación

Tengo en mi UITextField personalizada la salida:

 @IBInspectable var regexpValidation: String? = nil 

En el guión gráfico, puedo acceder a él a través del inspector de atributos y poner la cadena de expresiones regulares de esa manera (para el correo electrónico):

[a-z0-9!#$%&'*+/=?^_ {|} ~ -] + (?:. [a-z0-9! # $% &’ * + / =? ^ _ {|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

entonces en mi subclase tengo esta var computada:

@IBInspectable var regexpValidation: ¿Cadena? = nil // Opcional, configure esto en InterfaceBuilder

 var inputIsValid: Bool { get { if let expr = regexpValidation { return (text.rangeOfString(expr, options: NSStringCompareOptions.RegularExpressionSearch, range: nil, locale: nil) != nil) } else { return true } } } 

que podría usarse así:

  override func resignFirstResponder() -> Bool { if (inputIsValid) { return super.resignFirstResponder() } else { text = "" return false } } 

para mí La mejor manera fue usar NSPredicate y regex. esto es expresiones regulares para su caso: ^(?=.{10,})(?=.*[0-9])(?=.*[a-zA-Z])([@#$%^&=a-zA-Z0-9_-]+)$

imagen creada en debuggex.com

código objective C:

 NSString *regex = @"^(?=.{10,})(?=.*[0-9])(?=.*[a-zA-Z])([@#$%^&=a-zA-Z0-9_-]+)$"; NSPredicate *passwordTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; BOOL isValid = [passwordTest evaluateWithObject:yourTextfield.text]; 

Necesita escribir su código de validación en este método delegado de UITextField

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

Pocos enlaces a los que podría referirse para la implementación

cómo usar la expresión regular en iOS sdk

Validación de iOS TextField

Utilice el método control:isValidObject: del protocolo NSTextFieldDelegate que le permite validar el valor de un NSTextField. Suponiendo que tiene todos los bits y las piezas del constructor de interfaz configurados correctamente, puede hacer algo como esto:

 @interface PreferencesController : NSWindowController  { IBOutlet NSTextField *username, *password; } @end @implementation PreferencesController - (BOOL)control:(NSControl *)control isValidObject:(id)object { if (control == password) { // Perform validation and return YES or NO } return YES; } @end