关于TextView限制长度的中英文混合输入
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