需求:UItextField 輸入的時(shí)候既可以輸入中文也可以輸入英文,也有字?jǐn)?shù)限制。
所以采用下面代碼進(jìn)行監(jiān)聽字符串變化
[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)];
}
}
這種方式有個(gè)問題在中文輸入法的時(shí)候,因?yàn)橹形妮斎敕ㄓ新?lián)想功能,所以在聯(lián)想的框里字符串已經(jīng)超過限制的情況下就會(huì)出現(xiàn)bug:連續(xù)輸入中文的時(shí)候,當(dāng)聯(lián)想欄里的中文長度超過字符串限制的時(shí)候就會(huì)由正在編輯中變?yōu)榻Y(jié)束編輯且因?yàn)殚g隔特別大。如下圖

Paste_Image.png

Paste_Image.png
解決方案就是在截取字符串的時(shí)候?qū)κ欠窬庉嬛泻彤?dāng)前的輸入法作出判斷
-(void)textValueChanged:(UITextField *)textField
{
NSString *lang = [[UITextInputMode currentInputMode]primaryLanguage];//鍵盤輸入模式
if ([lang isEqualToString:@"zh-Hans"]) {// 簡(jiǎn)體中文輸入,包括簡(jiǎn)體拼音,健體五筆,簡(jiǎn)體手寫
UITextRange *selectedRange = [textField markedTextRange];
//獲取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
//沒有高亮選擇的字,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制
if (!position) {
textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|?]"];
if (textField.text.length>8) {
textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
}
}
//有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制
else{
}
}
// 中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可,不考慮其他語種情況
else{
textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|?]"];
if (textField.text.length>8) {
textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
}
}
}