[RedRain笔记] -限制TextView输入文字的长度

RedRain的简书:http://www.jianshu.com/users/29e03e6ff407/latest_articles

有时需要输入限定长度的文字数量.但是由于键盘的联想和粘贴会造成字数超出规定数.

在TextView中的代理方法处理一下超出的文字.就可以达到效果.


static NSInteger const kText_Length_MAX = 20;

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)atext{

if ((textView.text.length - range.length + atext.length) > kText_Length_MAX)

{

// 超出范围的文字, 截断到规定长度, 粘贴出现超出文字.
        NSString *tempString = [NSString stringWithFormat:@"%@%@",textView.text,atext];
        textView.text = tempString;
        
        
        NSString * lastStr =[tempString substringWithRange:NSMakeRange(kText_Length_MAX, 1)];

        // 如果这个字符是emoji的一部分,即无效的字符,那么这个就是nil
        if(lastStr.UTF8String == nil){
            
            NSInteger offset = tempString.length - kText_Length_MAX;
            NSInteger length = offset > 0 ? offset : 0;
            
            NSRange range = NSMakeRange(kText_Length_MAX+1  , length);
            textView.selectedRange = range;
            [textView insertText:@""];
            
        }else{
            NSString *substring = [tempString substringToIndex:kText_Length_MAX];
            textView.text = [substring copy];
        }
        return NO;
}

return YES;

}

//焦点发生改变
- (void)textViewDidChangeSelection:(UITextView *)textView {

    if (textView.text.length> kText_Length_MAX) {
        // 超出范围的文字, 截断到规定长度

        NSString * lastStr =[textView.text substringWithRange:NSMakeRange(kText_Length_MAX, 1)];

        // 如果这个字符是emoji的一部分,即无效的字符,那么这个就是nil
        if(lastStr.UTF8String == nil){
            // 此处截断,为了杜绝掉多次deleteBackward的重复循环,减少执行效率.
            NSString *substring = [textView.text substringToIndex:kText_Length_MAX + 1];
            textView.text = [substring copy];
            [textView deleteBackward];
        }
        
        
        // 上面删除一次, 如果还是超出, 再截断一次, 这里就不会有emoji了.
        if (textView.text.length> kText_Length_MAX) {
            
            NSString *substring = [textView.text substringToIndex:kText_Length_MAX];
            textView.text = [substring copy];
        }

    }

}

推荐阅读更多精彩内容