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
posted @ 2017-05-02 17:27  Francis01  阅读(3401)  评论(0编辑  收藏  举报