UITextView输入中文时限制字数

Posted Francis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITextView输入中文时限制字数相关的知识,希望对你有一定的参考价值。

最近因为项目中输入用户简称时限制长度,被测试部多次提交问题,最终将解决方法分享给大家。

刚开始用最简单的方法,在textView的代理方法里面做处理

 1 - (void)textViewDidChange:(UITextView *)textView
 2 {
 3     textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length];
 4 }
 5 
 6 
 7 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
 8 {
 9     if ([text isEqualToString:@"\n"])
10     {
11         [textView resignFirstResponder];
12         return NO;
13     }
14 
15     if (range.location > 30)
16     {
17         return  NO;
18     }
19     else
20     {
21         return YES;
22     }
23 }

这种情况下需要正好输入限定的长度时才好使,一次性拼音拼出来的字超过固定长度时textView的内容保持不变。

后来又修改成超过限定长度时直接从前到后取需要长度,代码如下:

 1 - (void)textViewDidChange:(UITextView *)textView
 2 {
 3     if (textView.text.length > 30)
 4     {
 5         textView.text = [textView.text substringToIndex:30];
 6         
 7         [[[UIAlertView alloc] initWithTitle:@"提示" message:@"限定长度为30" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
 8     }
 9     textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length];
10 }
11 
12 
13 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
14 {
15     if ([text isEqualToString:@"\n"])
16     {
17         [textView resignFirstResponder];
18         return NO;
19     }
20     return YES;
21 }

修改完后自己亲测通过,万万没想到测试部又提交上来了。问题内容大概是剩余两个字的时候拼音拼到一半(实际是输入两个字母)就提示了。根据问题又找到了原因:自己用第三方输入法,输入汉字时直接拼音不会到textView里面,测试部用的是手机系统输入法,拼的时候拼音直接就是textView的内容,这样就导致剩余两个字想输入“测试”,结果到“ces”的时候就提示了,找到原因就可以解决问题了,直接上代码:

 1 #define MAXSTRINGLENGTH 15    //限定输入长度
 2 
 3 
 4 - (void)textViewDidChange:(UITextView *)textView
 5 {
 6     NSString *lang = [[[UITextInputMode activeInputModes] firstObject] primaryLanguage];//当前的输入模式
 7     if ([lang isEqualToString:@"zh-Hans"])
 8     {
 9         UITextRange *range = [textView markedTextRange];
10         UITextPosition *start = range.start;
11         UITextPosition*end = range.end;
12         NSInteger selectLength = [textView offsetFromPosition:start toPosition:end];
13         NSInteger contentLength = textView.text.length - selectLength;
14         
15         if (contentLength > MAXSTRINGLENGTH)
16         {
17             textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH];
18             [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最长限制15个字" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
19 20         }
21         if (contentLength < MAXSTRINGLENGTH)
22         {
23             textCountlabel.text = [NSString stringWithFormat:@"还剩%ld个字", MAXSTRINGLENGTH - contentLength];
24         }
25         else
26         {
27             textCountlabel.text = @"还剩0个字";
28         }
29     }
30     else
31     {
32         if (textView.text.length > MAXSTRINGLENGTH)
33         {
34             textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH];
35             [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最长限制15个字" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
36             
37 } 38 textCountlabel.text = [NSString stringWithFormat:@"还剩%ld个字", MAXSTRINGLENGTH-textView.text.length]; 39 } 40 } 41

以上是关于UITextView输入中文时限制字数的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 解决字数限制问题和placehorder问题

UITextView字数限制

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

OC & Swift中UITextFiledUITextView限制输入字数

关于UITextView的限制字数显示,以及emjor表情占用字节处理,复制粘贴字节处理~优化

iOS输入限制字数时,避免与中文拼音拼写板冲突