iOStextFiled判断输入长度

个人在开发当中发现在用textField的代理方法

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

    if (textField.text.length > 5) {

            textField.text = [textField.text substringToIndex:5];
            return;
    }
}            

中判断长度大小时,键盘中联想出来的文字还是可以输入到textField中。

比如,你的限制是5,输入框已经是5个字了,联想的字是 ‘电话’还可以输入进去。

这个时候可以使用给textField加通知解决

[self.TextField addTarget:self action:@selector(addTextFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];

在通知的方法中判断。

 

//长度判断
-(void)addSpecsTextFieldEditChanged:(UITextField *)textField{
    
    NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
    if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
  
    }
    // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
    else{
        
        if ([textField isEqual:self.countText] ) {
            
            if ([textField.text floatValue] > 999) {
                
                textField.text = [textField.text substringToIndex:4];
                [self.toast makeToast:@"库存不能超过999!" duration:2.0 position:CSToastPositionCenter];
                return;
            }
        }
    }
    if ([textField isEqual:self.specsText] ) {
        
        if (textField.text.length > 20) {
            textField.text = [textField.text substringToIndex:20];
            [self.toast makeToast:@"规格不能超过20位字符!" duration:2.0 position:CSToastPositionCenter];
            return;
        }
    }

        UITextRange *selectedRange = [textField markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
        // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if (!position) {
            
            if ([textField isEqual:self.priceText] ) {
                
                if ([textField.text floatValue] >= 1000) {
                    
                    textField.text = [textField.text substringToIndex:5];
                    [self.toast makeToast:@"价格不能超过999.99!" duration:2.0 position:CSToastPositionCenter];
                    return;
                }
            }
            if ([textField isEqual:self.unitText] ) {
                if (textField.text.length > 4) {
                    textField.text = [textField.text substringToIndex:4];
                    [self.toast makeToast:@"单位不能超过4位字符!" duration:2.0 position:CSToastPositionCenter];
                    return;
                }
            }
            
        }
        // 有高亮选择的字符串,则暂不对文字进行统计和限制
        else{
            
        }
} 
//限制小数点
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
    if ([ToolClass stringContainsEmoji:string]) { //过滤表情
        return NO;
    }
    if (textField == self.priceText) {
        if ([textField.text rangeOfString:@"."].location == NSNotFound) {
            self.isHaveDian = NO;
        }
        if ([string length] > 0) {
            
            unichar single = [string characterAtIndex:0];//当前输入的字符
            if ((single >= '0' && single <= '9') || single == '.') {//数据格式正确
                
                //首字母不能为0和小数点
                if([textField.text length] == 0){
                    if(single == '.') {
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                    }
                    
                }
                
                //输入的字符是否是小数点
                if (single == '.') {
                    if(!self.isHaveDian)//text中还没有小数点
                    {
                        self.isHaveDian = YES;
                        return YES;
                        
                    }else{
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                    }
                }else{
                    if (self.isHaveDian) {//存在小数点
                        
                        //判断小数点的位数
                        NSRange ran = [textField.text rangeOfString:@"."];
                        if (range.location - ran.location <= 2) {
                            return YES;
                        }else{
                            
                            [self.toast makeToast:@"小数点后只能输入2位!" duration:2 position:CSToastPositionCenter];
                            return NO;
                        }
                    }else{
                        return YES;
                    }
                }
            }else{//输入的数据格式不正确
                
                [textField.text stringByReplacingCharactersInRange:range withString:@""];
                return NO;
            }
        }
        else
        {
            return YES;
        }
        
        
    }
    return YES;
}

 

//过滤表情
+ (BOOL)stringContainsEmoji:(NSString *)string

{

    __block BOOL returnValue = NO;

    

    [string enumerateSubstringsInRange:NSMakeRange(0, [string length])

                               options:NSStringEnumerationByComposedCharacterSequences

                            usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {

                                const unichar hs = [substring characterAtIndex:0];

                                if (0xd800 <= hs && hs <= 0xdbff) {

                                    if (substring.length > 1) {

                                        const unichar ls = [substring characterAtIndex:1];

                                        const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;

                                        if (0x1d000 <= uc && uc <= 0x1f77f) {

                                            returnValue = YES;

                                        }else{

                                            returnValue = YES;

                                        }

                                    }

                                } else if (substring.length > 1) {

                                    const unichar ls = [substring characterAtIndex:1];

                                    if (ls == 0x20e3) {

                                        returnValue = YES;

                                    }else{

                                        

                                        returnValue = YES;

                                    }

                                } else {

                                    if (0x2100 <= hs && hs <= 0x27ff) {

                                        

                                        if (10123 <= hs && hs <= 10130) {

                                            returnValue = NO;

                                        }else{

                                            returnValue = YES;

                                        }

                                    } else if (0x2B05 <= hs && hs <= 0x2b07) {

                                        returnValue = YES;

                                    } else if (0x2934 <= hs && hs <= 0x2935) {

                                        returnValue = YES;

                                    } else if (0x3297 <= hs && hs <= 0x3299) {

                                        returnValue = YES;

                                    } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {

                                        returnValue = YES;

                                    }

                                }

                            }];

    

    return returnValue;
}

 

/**
 *返回字符位数
 *传进来字符串计算出字符串中总字符数,其中一个汉字表示2位字符,数字
 *字母表示一位字符
*/
+ (NSInteger) computeStringCharCount:(NSString *)string{
    
    NSInteger count = 0;

    
    for (int i=0; i < string.length; i++){
        NSRange range = NSMakeRange(i, 1);
    
        NSString *subString=[string substringWithRange:range];
        const char *cString=[subString UTF8String];
        if ([self stringContainsEmoji:string]) {
            [SRMessage infoMessage:@"不能输入表情!"];
            return count;
        }
        if (strlen(cString)==3)
         {
             count = count + 2;
         }else if(strlen(cString)==1)
         {
             count = count + 1;
         }
    }
    
    return count;
}

 

转载于:https://www.cnblogs.com/ios988/p/6169881.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值