我有一个注册视图控制器,用户需要输入电子邮件地址,用户名和密码。
对于用户名和密码字段,您现在可以使用“user%$&”等用户名注册和密码,如“密码%^& $”。我不希望人们能够使用这些特殊字符。
我想这样做,以便用户名和密码字段只能用字母数字字符(字母和数字)提交。我找到了一些方法来做到这一点,但它们让我感到困惑,我需要这个方法专门用我的代码。
以下是用户输入电子邮件,用户名和密码并按下提交按钮时执行的一些代码:
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
,如果有任何非字母或数字的字符,则会显示警告视图。
感谢。
答案 0 :(得分:16)
如果您真的想限制用户输入特殊字符,那么最好的方法是使用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;
}
这将限制用户输入特殊字符。正如rmaddy指出的那样,在数据输入发生时进行这种验证总是好的。
PS:确保为文本字段设置委托。
答案 1 :(得分:10)
如果有人最终在这里寻找Swift的快速方法来做到这一点,这就是我的解决方案(其中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
在每次按键时,我们检查输入的字符是否包含在我们的样本集中,如果没有,我们返回false。
答案 2 :(得分:7)
更好的方式,
- (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;
}
注意,即使您可以通过在NSCharacterSet *allowedCharacters
文件(头文件)中声明.h
来提高内存效率,也可以在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;
}
答案 3 :(得分:2)
尽管回答已经很晚了,还有其他一些简单而有效的方法,但这个答案可能对某些人有用。
这很简单,对我来说就像是一种魅力。
斯威夫特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
}
注意:这也适用于将字符串粘贴到文本字段中。如果粘贴的字符串包含任何不需要的字符,则不会在文本字段中显示。