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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM