UITextView字数限制

原文地址:详释(常见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) { 

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

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

时间: 2024-10-12 20:50:25

UITextView字数限制的相关文章

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

好久没有写文章了,今天上来写写,发现增多了markDown编辑器.挺不错,后续研究一下,今天暂写文章先.好了,不废话. 如题,相信大家看到这个标题都不想看文章了,这有什么好说的,网上一搜一大把.好吧,自认为是一搜一大把的跳过,有兴趣的就看完...... 对于限制UITextView输入的字符数.相信大家在网上见得最多的是实现UITextViewDelegate - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSR

OC中限制UITextView的最大字数的实现

一.属性 //自定义的textview @property (weak, nonatomic) IBOutlet UITextView *textview; //添加一个bool类型的属性 @property (nonatomic, assign) BOOL isNameTextFieldEnbable; 二.监听通知.并初始化BOOL值 //UITextView的监听方法 [[NSNotificationCenter defaultCenter] addObserver:self select

UITextField &amp;&amp; UITextView 限制限制字数做法

有许多时候都有这种需求,那就是限制字数操作. 在没有一套好的方法之前,比如textView的限制方法就是利用代理方法 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if (textView.text.length  >= number) { textView.text = [textView.text substrin

UITextView 限制输入字数

尊重原创  http://blog.csdn.net/fengsh998/article/details/45421107 对于限制UITextView输入的字符数.相信大家在网上见得最多的是实现UITextViewDelegate - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;//有输入时触但对于中文键盘出示的联想字选

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

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

OC &amp; Swift中UITextFiled、UITextView限制输入字数

OC中限制字数的方法 我是用通知实现的,首先添加UITextFiled和UITextView的接收中心 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewNotifitionAction:) name:UITextViewTextDidChangeNotification object:nil]; [[NSNotificationCenter defaultCenter] addOb

ios中实现对UItextField,UITextView等输入框的字数限制

本文转载至 http://blog.sina.com.cn/s/blog_9bf272cf01013lsd.html 2011-10-05 16:48 533人阅读 评论(0) 收藏 举报 1.     如何实现对UITextField ,UITextView等输入框的 字数限制 (1)首先,肯定要 让controller 实现 UITextFieldDelegate (针对UITextField)或者  UITextViewDelegate(针对UITextView) 然后,将 输入框的del

分享一个字数限制和统计的UITextView分类方法

- (NSUInteger)letterCountWithLimits:(NSInteger)limits { NSString *toBeString = self.text; NSUInteger txtCount = toBeString.length; UITextRange *selectedRange = [self markedTextRange]; //获取高亮部分 UITextPosition *position = [self positionFromPosition:sel

UITextView限制输入字数

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