关于textView的字数限制

本文介绍了一种在 iOS 开发中限制 UITextView 输入字符数量的方法,并解决了默认方法无法阻止超过限制长度输入的问题。通过自定义分类及代理方法实现了字符计数与长度限制的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    换了一份新的工作后,由于需求,需要写一个限制字数的textView(只能输入50字符)。通过百度、谷歌,都是在下面这个方法进行限制(具体方法可直接浏览器搜索)。

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;

   但是经过测试,出现了一个问题,见下图:

 

图中红色框的内的文字,直接点击的时候,不会走之前的方法,因此,虽然50字符已满,但是还是可以输入。因此自己写了一个方法,可以避免这个问题的发生。

 在textView的分类中有下面的方法,规定了字符计算的规范(根据公司需求自己写的,非标准)

UITextView+ cate.h 文件中

-(BOOL)limitTVWithLength:(NSInteger)lenght;

 

UITextView+ cate.m 文件中

-(BOOL)limitTVWithLength:(NSInteger)lenght{

    UITextRange *selectedRange = [self markedTextRange];
    //获取高亮部分
    UITextPosition *pos = [self positionFromPosition:selectedRange.start offset:0];
    //如果在变化中是高亮部分在变,就不要计算字符了
    if (selectedRange && pos) {
        return YES;
    }
    
    NSInteger totalLenght = 0;
    NSInteger curIndex = -10;
    
    for (NSInteger i=0; i<self.text.length; i++) {
        NSString* subStr= [self.text substringWithRange:NSMakeRange(i, 1)];
        
        NSInteger changedLenhgt = subStr.btEngLishLength;
        
        if ((totalLenght == lenght*2-1) && (changedLenhgt == 2)) {
            curIndex = i;
        }
        
        totalLenght += subStr.btEngLishLength;
        
        if (totalLenght == lenght*2) {
            curIndex = i+1;
        } else if (totalLenght > lenght*2) {
            curIndex = i;
        }
        
        if (curIndex != -10) {
            break;
        }
        
    }
    if (curIndex != -10) {
        NSRange range = {0,curIndex};
        self.text = [self.text substringWithRange:range];
    }
   
    return NO;

}

在textView的代理方法中进行限制

- (void)textViewDidChange:(UITextView *)textView{
    //设置全局字符数
    self.textLength = textView.text.length;
    
    //显示字符数字
    NSString *str = [NSString string];
 
    //限制输入字数为50
    if (textView.text.length > 50) {
        
        str = [NSString stringWithFormat:@"%d/%d",50,50];
        
        if ([textView limitTVWithLength:50]==NO) {
            self.textLength = 50;
            NSString *str2 = [textView.text substringWithRange:NSMakeRange(0, 50)];
            
            self.textView.text = str2;
        }
    }else{
         str = [NSString stringWithFormat:@"%ld/%d",self.textLength,50];
     
    }

 

   //设置一些属性
    NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc]initWithString:str];
    
    [attStr addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:0.031 green:0.651 blue:0.941 alpha:1.000] range:NSMakeRange(0, str.length - 4)];
    

    //赋值回去
    self.label.attributedText = attStr;
      
}

以上是主要代码。另外,经过测试,表情符号也会自动转化为相关的数字。

 

转载于:https://www.cnblogs.com/dsp-ios/p/5452074.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值