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