码迷,mamicode.com
首页 > 其他好文 > 详细

UITextView字数限制

时间:2016-01-06 13:37:33      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

原文地址:详释(常见UITextView 输入之字数限制)之一---固定长度

对UITextView输入的字数进行限制,常用UITextView的Delegate:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  
 replacementText:(NSString *)text;//有输入时触但对于中文键盘出示的联想字选择时不会触发  
  
- (void)textViewDidChange:(UITextView *)textView;//当输入且上面的代码返回YES时触发。或当选择键盘上的联想字时触发。

第一个用于限制输入,第二个用于动态计算剩余字数。

#define MAX_LIMIT_NUMS     100 //来限制最大输入只能100个字符

完整代码:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  
 replacementText:(NSString *)text  
{  
    UITextRange *selectedRange = [textView markedTextRange];  
    //获取高亮部分  
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];  
    //获取高亮部分内容  
    //NSString * selectedtext = [textView textInRange:selectedRange];  
      
    //如果有高亮且当前字数开始位置小于最大限制时允许输入  
    if (selectedRange && pos) {  
        NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];  
        NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];  
        NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);  
          
        if (offsetRange.location < MAX_LIMIT_NUMS) {  
            return YES;  
        }  
        else  
        {  
            return NO;  
        }  
    }  
  
      
    NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];  
      
    NSInteger caninputlen = MAX_LIMIT_NUMS - comcatstr.length;  
      
    if (caninputlen >= 0)  
    {  
        return YES;  
    }  
    else  
    {  
        NSInteger len = text.length + caninputlen;  
        //防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错  
        NSRange rg = {0,MAX(len,0)};  
          
        if (rg.length > 0)  
        {  
            NSString *s = @"";  
            //判断是否只普通的字符或asc码(对于中文和表情返回NO)  
            BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];  
            if (asc) {  
                s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错  
            }  
            else  
            {  
                __block NSInteger idx = 0;  
                __block NSString  *trimString = @"";//截取出的字串  
                //使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个  
                [text enumerateSubstringsInRange:NSMakeRange(0, [text length])  
                                              options:NSStringEnumerationByComposedCharacterSequences  
                                           usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {  
                                                 
                                               if (idx >= rg.length) {  
                                                   *stop = YES; //取出所需要就break,提高效率  
                                                   return ;  
                                               }  
                                                 
                                               trimString = [trimString stringByAppendingString:substring];  
                                                 
                                               idx++;  
                                           }];  
                  
                s = trimString;  
            }  
            //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)  
            [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];  
            //既然是超出部分截取了,哪一定是最大限制了。  
            self.lbNums.text = [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];  
        }  
        return NO;  
    }  
  
}  
  
- (void)textViewDidChange:(UITextView *)textView  
{  
    UITextRange *selectedRange = [textView markedTextRange];  
    //获取高亮部分  
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];  
      
    //如果在变化中是高亮部分在变,就不要计算字符了  
    if (selectedRange && pos) {  
        return;  
    }  
      
    NSString  *nsTextContent = textView.text;  
    NSInteger existTextNum = nsTextContent.length;  
      
    if (existTextNum > MAX_LIMIT_NUMS)  
    {  
        //截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)  
        NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];  
          
        [textView setText:s];  
    }  
      
    //不让显示负数 口口日  
    self.lbNums.text = [NSString stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS - existTextNum),MAX_LIMIT_NUMS];  
}  

需要注意的地方:

1.中,英文字符输入时限制。

2.带emoji时截取显示半个或乱码字符处理。

 

针对emoji长度对上面代码的修改:

[text enumerateSubstringsInRange:NSMakeRange(0, [text length])  
                              options:NSStringEnumerationByComposedCharacterSequences  
                           usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {  
                                 
                               NSInteger steplen = substring.length;  
                               if (idx >= rg.length) {  
                                   *stop = YES; //取出所需要就break,提高效率  
                                   return ;  
                               }  
                                 
                               trimString = [trimString stringByAppendingString:substring];  
                                 
                               idx = idx + steplen;//这里变化了,使用了字串占的长度来作为步长  
                           }];  

把长度为2的emoji当作1个字符的处理:

[text enumerateSubstringsInRange:NSMakeRange(0, [text length])  
                                              options:NSStringEnumerationByComposedCharacterSequences  
                                           usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) { 

//////////////////////////////////////////

文章对各类文本内容的探讨十分有借鉴性。

UITextView字数限制

标签:

原文地址:http://www.cnblogs.com/karl87/p/5105026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!