Solo permita letras y numbers para un UITextField

Tengo un controller de vista de logging donde el usuario necesita ingresar una dirección de correo electrónico, un nombre de usuario y una contraseña.

Para los campos de nombre de usuario y contraseña, ahora mismo puede registrarse con un nombre de usuario como "user% $ &" y una contraseña como "password% ^ & $". No quiero que las personas puedan usar estos caracteres especiales.

Quiero hacerlo para que los campos de nombre de usuario y contraseña solo puedan enviarse con caracteres alfanuméricos alias letras y numbers. He encontrado algunos methods para hacer esto, pero son confusos y necesito que esto funcione específicamente con mi código.

Aquí hay algunos de los códigos que realizo cuando un usuario ha ingresado un correo electrónico, nombre de usuario y contraseña y presionan el button enviar:

NSString *user = [_usernameEntry text]; NSString *pass = [_passwordEntry text]; NSString *email = [_emailEntry text]; self.userSubmittedUsername = user; if ([user length] < 4 || [pass length] < 4) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Entry" message:@"Username and Password must both be at least 4 characters long." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [alert show]; } else if ([email length] < 8) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Entry" message:@"Please enter your email address." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [alert show]; } else { 

Me gustaría agregar otra else if en el código anterior y hacer que muestre una vista de alerta si hay caracteres que NO son letras o numbers.

Gracias.

Si realmente quiere restringir que el usuario ingrese caracteres especiales, probablemente la mejor manera sea usar shouldChangeCharactersInRange: method

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(textField==YOUR_USER_NAME_TEXTFIELD || textField == YOUR_PASSWORD_TEXTFIELD) { NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"]; for (int i = 0; i < [string length]; i++) { unichar c = [string characterAtIndex:i]; if (![myCharSet characterIsMember:c]) { return NO; } } return YES; } return YES; } 

Esto restringirá que el usuario ingrese los caracteres especiales. Como señaló Rmaddy, siempre es bueno hacer este tipo de validation cuando ocurre la input de datos.

PS: asegúrese de configurar el delegado para sus campos de text.

Si alguien termina aquí buscando una manera rápida en Swift para hacer esto, aquí está mi solución (donde el UITextField permite letras mayúsculas, minúsculas, numbers y espacios).

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let set = NSCharacterSet(charactersInString: "ABCDEFGHIJKLMONPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ").invertedSet return string.rangeOfCharacterFromSet(set) == nil } 

Si no fuera por el espacio, simplemente podría usar

 let set = NSCharacterSet.alphanumericCharacterSet().invertedSet 

En cada pulsación de tecla, comprobamos si el carácter ingresado está contenido en nuestro set de muestras, de lo contrario, devolvemos falso.

Un poco más de buena y mejor manera,

Buen path

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters { if(textField.tag == yourTextFieldTag) { NSCharacterSet *allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; return ([characters rangeOfCharacterFromSet:allowedCharacters].location == NSNotFound); } return YES; } 

Mejor manera

Tenga en count que incluso puede hacer que la memory sea eficiente si declara NSCharacterSet *allowedCharacters en el file .h (file de encabezado), y en viewDidLoad puede escribir esto,

 allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

entonces puedes usarlo así,

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters { if(textField.tag == yourTextFieldTag) { return ([characters rangeOfCharacterFromSet:allowedCharacters].location == NSNotFound); } return YES; } 

Aunque es tarde para responder y hay otros enfoques simples y excelentes, pero esta respuesta podría ser útil para alguien.

Esto es simple y funcionó como un encanto para mí.

Swift 3:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { /// 1. replacementString is NOT empty means we are entering text or pasting text: perform the logic /// 2. replacementString is empty means we are deleting text: return true if string.characters.count > 0 { var allowedCharacters = CharacterSet.alphanumerics let unwantedStr = string.trimmingCharacters(in: allowedCharacters) return unwantedStr.characters.count == 0 } return true } 

Nota: Esto también funcionará para pegar cadenas en el campo de text. La cadena pegada no se mostrará en el campo de text si contiene caracteres no deseados.