【问题标题】:How to Ristrict Whitespace in UITextfield?如何限制 UITextfield 中的空白?
【发布时间】:2015-03-18 10:43:39
【问题描述】:

密码验证,一切正常,但它也允许空格,如何限制那个,输入密码后它不会删除它。我的密码长度是 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;
}

【问题讨论】:

标签: ios


【解决方案1】:

用这个替换你的 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)

【讨论】:

  • 不接受小于 8 个字符。如果你知道,如何解决这个问题?
  • 在我的代码中 if([password.text length]
  • textFieldDidEndEditing 第一次。
【解决方案2】:

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

使用合理的变量名。 lowerCaseLetter 是包含小写字母的变量的好名称。对于描述字符串是否包含小写字母的布尔变量来说,这是一个糟糕的名称。称之为“hasLowercaseLetter”或“containsLowercaseLetter”。如果你找不到好的变量名,你就会陷入困境。

这个“\0”是关于什么的?那太可怕了。 '\0' 是一个字符。将 BOOL 初始化为 YES 或 NO。每行一个变量。这太可怕了。为什么您的代码如此不一致,以至于您必须使用两种不同的方式来检查下一个字符?如果我看到有人使用两种不同的方式来实现相同的目标,我预计至少会有一个错误,有时是两个。

你到底为什么要限制密码长度?这是荒谬的。显然我可以使用一个小技巧输入超过八个字符,但也应该很明显,当用户输入八个字符时,您不再允许任何更改!为什么你认为有一个参数“范围”和一个参数“replacementString”?你能想到它们的值会如何影响你应该在 shouldChangeCharactersInRange 中返回的值吗?

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多