TextView的输入限制长度的时候,会出现一些小问题,如果不特别注意的话,不会有太大问题,但是如果要求高的话,这就不能放过了。假设一种情况,最大输入长度为25个字符,当我们已经输入24个字符的时候,想要输入一个“五”字,不做处理的话,输入一个"w"的时候,再输入"u"的时候,就会提示达到最大输入长度了,这是不符合我们要求的,这就是中英文输入的一个坑。
由于再输入的时候,TextView是统计备选框中英文字母的个数的,这样导致我们想要的效果达不到。
以下是一种处理方式
1.先添加一个观察者
1 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeMode:) name:@"UITextInputCurrentInputModeDidChangeNotification" object:nil];
2.实现观察者的方法,切换输入法,显示当前的输入法
-(void) changeMode:(NSNotification *)notification{
NSLog(@"%@",[[UITextInputMode currentInputMode] primaryLanguage]);
}
输出结果
2016-01-22 11:04:20.966 TextView[1149:41370] zh-Hans 中文
2016-01-22 11:04:29.765 TextView[1149:41370] en-US 英文
2016-01-22 11:04:33.400 TextView[1149:41370] emoji 表情
3.实现TextView的代理方法
- (void)textViewDidChange:(UITextView *)textView
{
// UITextInputMode *mode = [[UITextInputMode activeInputModes] firstObject];
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];//当前的输入模式
if ([lang isEqualToString:@"zh-Hans"])
{
// 如果输入有中文,且没有出现文字备选框就对字数统计和限制
// 出现了备选框就暂不统计
UITextRange *range = [textView markedTextRange];
UITextPosition *position = [textView positionFromPosition:range.start offset:0];
if (!position)
{
[self checkText:textView];
}
}
else
{
[self checkText:textView];
}
}
4.判断
- (void)checkText:(UITextView *)textView
{
NSString *string = textView.text;
if (string.length > kMaxLength)
{
UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"最多输入25个字符" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
textView.text = [string substringToIndex:kMaxLength];
}
NSInteger length = textView.text.length;
NSInteger num = kMaxLength - length;
num = MAX(num, 0);
}
实现效果
此方法也可以用于TextField