仅允许UITextField的字母和数字

时间:2014-03-08 04:07:56

标签: ios iphone objective-c if-statement uitextfield

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

对于用户名和密码字段,您现在可以使用“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,如果有任何非字母或数字的字符,则会显示警告视图。

感谢。

4 个答案:

答案 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
}

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