关于textView的字数限制

换了一份新的工作后,由于需求,需要写一个限制字数的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;
      
}

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

时间: 2024-10-13 08:56:34

关于textView的字数限制的相关文章

Android中TextView输入字数统计和限制

在Android开发应用的时候,文本编辑框中最多输入140个字,经常会显示还剩多少字以限制用户输入的字数, EditText content;//定义一个文本输入框 TextView hasnum;// 用来显示剩余字数 int num = 140;//限制的最大字数 content = (EditText) findViewById(R.id.et_content); hasnumTV = (TextView) findViewById(R.id.tv_num); hasnumTV.setTe

自定义textView限制字数

ViewController.m #import "JYZTextView.h" #define kTextBorderColor     RGBCOLOR(227,224,216)   #undef  RGBCOLOR #define RGBCOLOR(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1] @interface ViewController ()<UITextViewDe

textView限定字数

/*由于联想输入的时候,函数textView:shouldChangeTextInRange:replacementText:无法判断字数, 因此使用textViewDidChange对TextView里面的字数进行判断 */ - (void)textViewDidChange:(UITextView *)textView { //该判断用于联想输入 if (textView.text.length > BOOKMARK_WORD_LIMIT) { textView.text = [textVi

IOS textField(textview)字数判断

textfield 有时会需要设置字数限制,如果只是英文或者符号,可以直接在以下代理方法中判断字数 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ return YES; } 但是,如果是中文且开启联想的情况下,可能选中(高亮)的字也会加入到字数统计,导致最后的几个字输入失败解决方法给textfi

UITextView的字数限制 及 添加自定义PlaceHolder

- (void)textViewDidChange:(UITextView *)textView{ NSString *temp=textView.text; //字数超过限制数量时,进行截取替换 if([[textView text] length] > _limitCharactorNumbers){ textView.text=[temp substringToIndex:_limitCharactorNumbers]; } //显示剩余字数 _leftNumberLabel.text =

UITextView限制输入字数

很多时候我们想限制textView中的输入字数,我们可以利用函数- (void)textViewDidChange:(UITextView *)textView中统计textView实现此功能.通过在此函数中统计你输入的字符的个数,当字数超过你限制的字数时调用函数-(NSString *)substringToIndex:(int)length(length是你想限制的字数). 这样当你输入的字符达到限定的个数时,将无法在往textView中输入数据.(实际上是你新输入的数据被函数-(NSStr

textView输入中文时和高亮英文输入法时的字数统计

统计字数 1.首先注册监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEditChanged:) name:@"UITextViewTextDidChangeNotification" object:_textView]; 2.实现监听方法 - (void)textViewEditChanged:(NSNotification *)obj{ UITextView *

TextView里限制输入字数的方法

一开始采用的方法是函数textView:shouldChangeTextInRange:replacementText:来进行判断: //键入Done时,插入换行符,然后执行addBookmark - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { //判断加上输入的字符,是否超过界限 NSString *str = [N

iOS【textView或者textField文本输入字数限制】

[textView文本输入 字数限制] // 监听文本改变  触发时机(通过发送通知完成) -(void)textViewEditChanged:(NSNotification *)obj{ UITextView *textView = (UITextView *)obj.object; NSAttributedString *toBeString = textView.attributedText; //    NSLog(@" - -%@",[_contentView.textIn