我是iOS开发。在开发新的需求时,有对验证码的校验。以此为例,来说说我是如何校验的。
首先,我从用户体验入手。需求中,1.验证码要求是纯数字,且为六位。2.当验证码框为nil时,下一步按钮不能使用。3.验证码框有且仅能输入六位数字。4.如果用户输入验证码错误,要显示行小红字,提醒用户。
自我设计是这样的:当用户输入非数字(字母,标点,特殊符号,空格等)时,小红字出现,提醒用户“验证码是六位纯数字”。直到用户修改错误的验证码为止,小红字消失。直到用户输入六位数字验证码时,下一步按钮才可用。点击下一步,发送网络请求,如果验证码错误,则显示小红字,提示“验证码错误”。
我选用系统数字键盘来配合输入框完成上述需求。
我实现了输入框UITextField协议:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//保证输入框中只能输入六位
if ((range.location >= 6 || textField.text.length >= 6) && ![string isEqualToString:@""]) {
return NO;
}
//非数字报错
if (![string isEqualToString:@""]) {//添加时,除了敲空格键,其余string不为空
if (![string isEqualToString:@"0"]) {
int value = [string intValue];//非数字的string,经过intValue方法,返回均为0
if (!value) {
self.errorText.hidden = NO;
[self.errorText setTitle:@"错误!验证码为6位纯数字" forState:UIControlStateDisabled];
[self.errorLocationArr addObject:@(range.location)];//将错误输入的位置记录在array中
}
}
}else{//删除时,string 为空
if ([self.errorLocationArr containsObject:@(range.location)]) {//查看删除的位置,是否包含非法字符,如果有,则将array中记录非法字符的位置删除。
[self.errorLocationArr removeObject:@(range.location)];
}
if (self.errorLocationArr.count == 0) {//记录非法字符的array清空后,就错误提示消失。
self.errorText.hidden = YES;
}
}
if (textField.text.length == 5 && ![string isEqualToString:@""] && self.errorText.hidden) {
[self nextBtn:self.nextBtn status:YES];//输入框中内容符合条件,下一步按钮可用
}else{
[self nextBtn:self.nextBtn status:NO];//输入框中内容不符合条件,下一步按钮不可用
}
return YES;
}
//点击clear按钮,触发事件
- (BOOL)textFieldShouldClear:(UITextField *)textField {
self.errorText.hidden = YES;
[self nextBtn:self.nextBtn status:NO];
return YES;
}