如何在UITextfield中占用空白?

时间:2015-03-18 10:43:39

标签: ios

密码验证,每件事都没问题,但它也允许空格,如何限制那个,输入密码后它不会删除它。我的密码长度为8个字符,只允许8或4,但不接受5到7个字符。这是我的代码。请检查一次。提前谢谢。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if([passwrd.text length] < 8)
    return YES;
else
    return NO;
}

-(void)textFieldDidEndEditing:(UITextField *)textField{
//int numberofCharacters = 0;
BOOL lowerCaseLetter = '\0',upperCaseLetter = '\0',digit = '\0',specialCharacter = 0;
if([passwrd.text length] >= 8)
{
    for (int i = 0; i < [passwrd.text length]; i++)
    {
        unichar c = [passwrd.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 && [[NSCharacterSet punctuationCharacterSet] characterIsMember:c]) {
            specialCharacter = YES;

        }
    }

    if(specialCharacter && digit && lowerCaseLetter && upperCaseLetter)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success"
        message:@"Successfully Created Password"
        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];

    }
    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 Only 8 Characters"
    delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}
}


- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[passwrd resignFirstResponder];
return YES;
}

3 个答案:

答案 0 :(得分:2)

将此shouldChangeCharactersInRange方法替换为此

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if(string.length == 0){
        // Returning yes here to allow entry of backspace
        return YES;
    }

    if([string isEqualToString:@" "]){
       // Returning no here to restrict whitespace
       return NO;
    }

    if([passwrd.text length] < 8)
        return YES;
    else
       // By returning no here, you are restricting the user to enter no more
       // than 8 characters. You should not do this ideally. So, after the user
       // enters 8 characters, even backspace will not be registered.
       // For the user to be able to enter backspace, I added the first condition
       // above in the method.
       return NO;
}

编辑:

要接受低于8个字符的密码,您需要完全更改textFieldDidEndEditing方法。什么是\0字符?那是完全错误的。正如@ gnasher729建议的那样,使用YESNO初始化您的布尔值,而不是\0

if([passwrd.text length] >= 8)
textFieldDidEndEditing中的

条件不是您等待IMO的条件。如果文本长度大于或等于,您正在进行密码检查.8。您应该检查文本长度是否小于或等于 8,因为无论如何,超过8个字母不被接受。

所以,用这个替换它

if([passwrd.text length] <= 8)

答案 1 :(得分:1)

阅读NSString文档并查找检查字符串是否包含字符集中任何字符的方法。这将极大地减少测试中所有字符的代码。

使用合理的变量名称。 lowerCaseLetter是包含小写字母的变量的精细名称。它是一个可怕的名称,用于描述字符串是否包含小写字母的布尔变量。称之为&#34; hasLowercaseLetter&#34;或&#34; containsLowercaseLetter&#34;。如果你找不到好的变量名,你就会遇到麻烦。

这是什么&#39; \ 0&#39;关于?那是一个神圣的。 &#39; \ 0&#39;是一个炭。将BOOL初始化为YES或NO。每行一个变量。这太可怕了。为什么你的代码如此不一致,你必须使用两种不同的方法来检查下一个字符?如果我发现某人使用两种不同的方法来实现相同的目标,我预计至少会有一个错误,有时是两个。

为什么你试图限制密码长度?那太荒谬了。显然,我可以使用一个小技巧输入超过八个字符,但同样显而易见的是,当用户输入八个字符时,您不再允许任何更改!为什么你认为有一个参数&#34;范围&#34;和参数&#34; replacementString&#34;?你能想到他们的价值观会如何影响你应该在shouldChangeCharactersInRange中返回什么?

答案 2 :(得分:0)

您可以使用NSRegularExpression来解决此问题。它更容易实现。这是一个快速链接。 Regular Expression for password in iPhone

如果您真的想详细了解并了解其工作原理,这里还有一个很棒的教程。 http://www.raywenderlich.com/30288/nsregularexpression-tutorial-and-cheat-sheet

希望这会对你有所帮助。干杯! :)