UITextField 中文输入状态下 截取字符串 bug问题

需求:UItextField 输入的时候既可以输入中文也可以输入英文,也有字数限制。
所以采用下面代码进行监听字符串变化

[textField addTarget:self action:@selector(textValueChanged:) forControlEvents:UIControlEventEditingChanged];

-(void)textValueChanged:(UITextField *)textField
{
        if (textField.text.length>8) {
             textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
         }
}

这种方式有个问题在中文输入法的时候,因为中文输入法有联想功能,所以在联想的框里字符串已经超过限制的情况下就会出现bug:连续输入中文的时候,当联想栏里的中文长度超过字符串限制的时候就会由正在编辑中变为结束编辑且因为间隔特别大。如下图

Paste_Image.png
Paste_Image.png

解决方案就是在截取字符串的时候对是否编辑中和当前的输入法作出判断

-(void)textValueChanged:(UITextField *)textField
{
 NSString *lang = [[UITextInputMode currentInputMode]primaryLanguage];//键盘输入模式
        if ([lang isEqualToString:@"zh-Hans"]) {// 简体中文输入,包括简体拼音,健体五笔,简体手写
            UITextRange *selectedRange = [textField markedTextRange];
            //获取高亮部分
            UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
            //没有高亮选择的字,则对已输入的文字进行字数统计和限制
            if (!position) {
                textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|•]"];

                if (textField.text.length>8) {
                    textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
                }
            }
            //有高亮选择的字符串,则暂不对文字进行统计和限制
            else{
                
            }
        }
        // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        else{
            textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|•]"];

            if (textField.text.length>8) {
                textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
            }
        }

}

推荐阅读更多精彩内容