只允许UITextField的字母和数字

我有一个注册视图控制器,用户需要input电子邮件地址,用户名和密码。

对于用户名和密码字段,现在您可以使用“user%$&”等用户名和密码“password%^&$”来注册。 我不希望人们能够使用这些特殊字符。

我想这样做,以便用户名和密码字段只能提交与字母数字字符又名字母和数字。 我发现了一些方法来做到这一点,但他们混乱,我需要这个专门与我的代码工作。

以下是我在用户input电子邮件,用户名和密码时执行的一些代码,然后按提交button:

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 { 

else if进入上面的代码,我只想添加另一个,如果有任何不是字母或数字的字符,它显示一个警报视图。

谢谢。

如果你真的想限制用户input特殊字符,那么最好的方法是使用shouldChangeCharactersInRange:方法

 -(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; } 

这将限制用户input特殊字符。 正如rmaddy指出的那样,在数据input发生时进行这种validation总是很好的。

PS:确保你为你的文本框设置了委托。

如果有人在这里寻找一个快速的方法在Swift中做到这一点,这里是我的解决scheme(其中UITextField允许大写字母,小写字母,数字和空格)。

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

如果不是空间,你可以简单地使用

 let set = NSCharacterSet.alphanumericCharacterSet().invertedSet 

在每个按键上,我们检查input的字符是否包含在我们的样本集中,如果不是,我们返回false。

一些更好更好的方法,

好办法

 - (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; } 

更好的方法

请注意,即使您可以通过在.h文件(头文件)中声明NSCharacterSet *allowedCharacters来使内存高效,而在viewDidLoad您可以编写它,

 allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

那么你可以像这样使用它,

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

虽然回答迟到,还有其他简单而好的方法,但是这个答案可能对某人有用。

这很简单,对我来说就像一个魅力。

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 } 

注意:这也适用于将string粘贴到文本字段中。 如果粘贴的string包含任何不需要的字符,则不会在文本字段中显示。