美文网首页
iOS textField车牌号输入限制

iOS textField车牌号输入限制

作者: eaa7ee65216b | 来源:发表于2018-11-15 13:18 被阅读0次

对于车牌号的输入限制来说,算是相对于来说比较麻烦的,不像手机号限制,只需要进行键盘限制和输入的时候进行数字校验就可以。而车牌号也是有相对应格式的:汉字+大写字母+大写字母或数字(5位)。

我们通常在进行校验的时候,一般都在这个方法中进行校验:

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string

但是我们在进行首字母为汉字的时候就会出现问题,因为我们在输入汉字的时候,键盘会将我们输入的拼音进行高亮展示放在textfield中(例如:我们想要输入“京”,textfield会将拼音jing展示出来包含在蓝色区域内),无法获取我们想要的汉字进行校验。导致我们无法在这个方法中进行输入校验。

那么我们就换一种方式处理,对textfield进行输入监听

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldTextHasChange:) name:UITextFieldTextDidChangeNotification object:self.textField];

监听事件处理

- (void)textFieldTextHasChange:(NSNotification *)notification {
    //获取高亮部分
    UITextRange *selectedRange = self.textField.markedTextRange;
    UITextPosition *position = [self.textField positionFromPosition:selectedRange.start offset:0];
    
    if (!position) { // 没有高亮选择的字
        if ([self.applyModel.name containsString:@"车牌号"]) {
            //  在输入的时候校验车牌号
            if (![ProveModel inputValidateWithTextField:self.textField]) {
                return;
            }
        }
    }else { //有高亮文字
        //do nothing
    }
}

下边是用到的一些判断方法和限制方法,我将他们单独写在一个校验类里,方便其他地方调用。

#pragma mark - 车牌号输入限制
+ (BOOL)inputValidateWithTextField:(UITextField *)textField {
    NSString *strNew = [NSString stringWithString:textField.text];
    if (strNew.length > 7) {  //  7位
        strNew = [strNew substringToIndex:7];
    }
    for (int i = 1; i<=strNew.length; i++) {
        if (i == 1) {
            NSString *firstStr = [strNew substringToIndex:1];
            if ([firstStr isChinese]) {  //  判断是否为汉字
                [textField setText:firstStr];
            } else {
                //  设置为空串,不然会将第一个输入的非汉字记录在textfield中
                textField.text = @"";
                return NO;
            }
        }
        if (i == 2) {
            NSString *secondStr = [strNew substringWithRange:NSMakeRange(1, 1)];
            if ([self isUpperEnglish:secondStr]) {   //  判断是否为大写字母
                [textField setText:[strNew substringToIndex:i]];
            } else {
                //  这里不需要再设置 self.textField的值,因为再i==1的时候设置过啦(for循环)。
                return NO;
            }
        }
        if (i > 2) {
            NSString *str = [strNew substringWithRange:NSMakeRange(i-1, 1)];
            if ([self numAndUpperEnglish:str]) {  //  判断是否为大写字母和数字
                [textField setText:[strNew substringToIndex:i]];
            } else {
                return NO;
            }
        }
    }
    return YES;
}
#pragma mark - 判断是否是汉字
- (BOOL)isChinese
{
    NSString *chinese = @"^[\u4E00-\u9FA5]*$";
    NSPredicate *chinesePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", chinese];
    return [chinesePredicate evaluateWithObject:self];
}
#pragma mark - 判断是否是大写字母
#define UPPER @"ABCDEFGHIJKLMNOPQRSTUVWXYZ" //   大写字母
+ (BOOL)isUpperEnglish:(NSString *)str
{
    for (int i= 0; i<str.length; i++) {
        NSString * subStr = [str substringWithRange:NSMakeRange(i, 1)];
        if (![UPPER containsString:subStr]) {
            return NO;
        }
    }
    return YES;
}
#pragma mark - 判断是否是大写字母和数字
#define UPPERNUM @"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" //   大写字母和数字
+ (BOOL)numAndUpperEnglish:(NSString *)str
{
    for (int i= 0; i<str.length; i++) {
        NSString * subStr = [str substringWithRange:NSMakeRange(i, 1)];
        if (![UPPERNUM containsString:subStr]) {
            return NO;
        }
    }
    return YES;
}

这样就可以实现对车牌号进行输入的时候进行逐个校验。方法虽然有点low但是是可以实现功能的。
最后附加一个输入完成后的车牌号正则校验方法。

#pragma mark ***_车牌号正则_***
- (BOOL)validateCarNo:(NSString*)carNo {
    NSString *carRegex =@"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
    NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];
    //    NSLog(@"carTest is %@",carTest);
    if ([carTest evaluateWithObject:carNo]) {
        return YES;
    }else{
        return NO;
    }
}

相关文章

  • iOS textField车牌号输入限制

    对于车牌号的输入限制来说,算是相对于来说比较麻烦的,不像手机号限制,只需要进行键盘限制和输入的时候进行数字校验就可...

  • UITextField输入限制汇总

    iOS常用正则表达式 textField输入金额、数字、整数、小数 输入判断 2.textField输入个数限制遇...

  • UITextField详解

    1.ios中怎样限制textfield只能输入字母和数字 //设置键盘类型 self.textField.keyb...

  • iOS textField 限制输入

    iOS textField 限制输入 期望效果是 用户输入的数字只能是小数点后面两位 例: 50.65 跟微信QQ...

  • iOS TextField输入限制

    在项目中,当我们用到TextField时,必然需要对其进行一些限制,在此总结如下。对TextField进行限制,必...

  • textField 输入判断金额

    //对输入框的限制 金额限制 - (BOOL)textField:(UITextField *)textField...

  • iOS Textfield输入限制设置

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField ...

  • iOS textField输入金额限制

  • iOS 所有对textField的变态限制

    限制输入金额的输入框 支付时输入框 限制textField输入字数 包含中文、字母 普通字母 输入限制 限制输...

  • UU_Get

    1.TextField输入金额限制 2 拖拽约束实现布局动画 3 打电话 4 iOS提交TestFlight测试显...

网友评论

      本文标题:iOS textField车牌号输入限制

      本文链接:https://www.haomeiwen.com/subject/ghxyfqtx.html