尊重原创 http://blog.csdn.net/fengsh998/article/details/45421107
对于限制UITextView输入的字符数。相信大家在网上见得最多的是实现UITextViewDelegate
- - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
- replacementText:(NSString *)text;
-
- - (void)textViewDidChange:(UITextView *)textView;
第一个用于限制输入,第二个用于动态计算剩余字数。好吧,就来慢慢的给大家分析这两个代理共同协作来限制输入。
从最简单的开始。为了便于讲析,声明
#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];
-
-
-
-
- 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;
-
- NSRange rg = {0,MAX(len,0)};
-
- if (rg.length > 0)
- {
- NSString *s = @"";
-
- BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];
- if (asc) {
- s = [text substringWithRange:rg];
- }
- else
- {
- __block NSInteger idx = 0;
- __block NSString *trimString = @"";
-
- [text enumerateSubstringsInRange:NSMakeRange(0, [text length])
- options:NSStringEnumerationByComposedCharacterSequences
- usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
-
- if (idx >= rg.length) {
- *stop = YES;
- return ;
- }
-
- trimString = [trimString stringByAppendingString:substring];
-
- idx++;
- }];
-
- s = trimString;
- }
-
- [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)
- {
-
- 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];
- }
回顾一下,文章到此,共解决了哪些易遗留的BUG
1.中,英文字符输入时限制。
2.带emoji时截取显示半个或乱码字符处理。
UITextView 限制输入字数
原文:http://www.cnblogs.com/wangyang1213/p/5885946.html