现在APP中经常需要注册登录操作,在注册时设置密码会需要根据输入的内容来显示密码强度。最近在项目中需要处理这样一种情况。
在网上也有一些处理方法,但是看了都不是很满意,所以决定还是自己写。
首先实现主要是从两个方面开始。
1.如何将密码强度与输入内容联系在一起
这个需要结合使用textfield 的代理方法
2.如何判断密码强度
这个是逻辑问题
// 0.先判断输入的长度是不是大于6
// 1.如果小于6为则显示密码强度太低提示
// 2.如果大于6再判断其组成成分
// 3.如果组成全部是字母,数字,符号的某一种,则判断为低强度
// 4.如果组成是上述中的两种则判断为中强度
// 5.如果组成是上述中的三种则判断为高强度
具体代码实现:
@interface ViewController ()<UITextFieldDelegate>
{
BOOL _isback; // 如果还有其他的textfield,这个时候需要这个变量,保证密码强度显示正常。
UIImageView *_remindImage; // 密码强度图片视图
}
@end
- (void)viewDidLoad {
UITextField *tf = [[UITextFieldalloc] initWithFrame:CGRectMake(20,50, 200,50)];
_remindImage = [[UIImageViewalloc] initWithFrame:CGRectMake(10,CGRectGetMaxY(tf.frame)+30,300, 10)];
[self.viewaddSubview:_remindImage];
tf.borderStyle =UITextBorderStyleRoundedRect;
tf.placeholder =@"测试密码长度";
tf.secureTextEntry =YES; // 设置密码保护 ,这一步是必须的,这样能够保证字母一个个的输入,及时判断
tf.delegate =self;
[self.viewaddSubview:tf];
}
// 这里需要textfield 的两个代理方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
_isback =YES;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (_isback)
{
_remindImage.hidden =YES;
_isback =NO;
}else
{
NSString *joinpw =nil;
NSMutableString *deleStr = [textField.textmutableCopy];
if ([stringisEqualToString:@""])// 当后退删除密码时处理
{
[deleStr deleteCharactersInRange:NSMakeRange(deleStr.length-1,1)];
joinpw = deleStr;
}else // 当还在增加密码长度时处理
{
joinpw = [textField.textstringByAppendingString:string];
}
if (joinpw.length >5)
{
PASSWORDSTRENGTH pasw = [selfanalyzePassWorldWith:joinpw];
switch (pasw)
{
caseLOWPASSWORD:
{
_remindImage.hidden =NO;
_remindImage.image = [UIImageimageNamed:@"PsdStrength_Weak.png"];
}
break;
caseMIDDLEPASSWORD:
{
_remindImage.hidden =NO;
_remindImage.image = [UIImageimageNamed:@"PsdStrength_Fair.png"];
}
break;
caseHIGHPASSWORD:
{
_remindImage.hidden =NO;
_remindImage.image = [UIImageimageNamed:@"PsdStrength_Good.png"];
}
break;
default:
break;
}
}else
{
_remindImage.hidden =YES;
}
}
returnYES;
}
// 解析密码的逻辑
- (PASSWORDSTRENGTH)analyzePassWorldWith:(NSString *)password
{
BOOL isnum =NO;
BOOL isalph =NO;
BOOL isSymbol =NO;
constchar *pwch = [password cStringUsingEncoding:NSUTF8StringEncoding];
for (NSInteger i=0; i<strlen(pwch); i++)
{
// 判断的逻辑原理是根据字符的ASCII 编码值
char s = pwch[i];
if (s >47 && s <58)
{
isnum = YES;
}
elseif ((s > 64 && s <91) ||(s > 96 && s <123)) {
isalph = YES;
}else
{
isSymbol = YES;
}
}
if ((isnum && isalph && !isSymbol) || (isnum && isSymbol && !isalph) || (isalph && isSymbol && !isnum))
{
returnMIDDLEPASSWORD;
}elseif (isnum && isalph && isSymbol)
{
returnHIGHPASSWORD;
}else
{
returnLOWPASSWORD;
}
}
菜鸟原创,如有雷同,纯属巧合,如有错误,欢迎指正