密码验证,每件事都没问题,但它也允许空格,如何限制那个,输入密码后它不会删除它。我的密码长度为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;
}
答案 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建议的那样,使用YES
或NO
初始化您的布尔值,而不是\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
希望这会对你有所帮助。干杯! :)