关于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

 

 

 

posted @ 2016-01-22 12:13  简单飞先生  阅读(1541)  评论(0编辑  收藏  举报