需求:UItextField 輸入的時候既可以輸入中文也可以輸入英文逼泣,也有字數(shù)限制礼患。
所以采用下面代碼進行監(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)];
}
}
這種方式有個問題在中文輸入法的時候碌宴,因為中文輸入法有聯(lián)想功能个曙,所以在聯(lián)想的框里字符串已經(jīng)超過限制的情況下就會出現(xiàn)bug:連續(xù)輸入中文的時候察郁,當聯(lián)想欄里的中文長度超過字符串限制的時候就會由正在編輯中變?yōu)榻Y(jié)束編輯且因為間隔特別大伙菜。如下圖
解決方案就是在截取字符串的時候?qū)κ欠窬庉嬛泻彤斍暗妮斎敕ㄗ鞒雠袛?/p>
-(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];
//沒有高亮選擇的字火的,則對已輸入的文字進行字數(shù)統(tǒng)計和限制
if (!position) {
textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|?]"];
if (textField.text.length>8) {
textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
}
}
//有高亮選擇的字符串,則暫不對文字進行統(tǒng)計和限制
else{
}
}
// 中文輸入法以外的直接對其統(tǒng)計限制即可丧叽,不考慮其他語種情況
else{
textField.text= [self filterCharactor:textField.text withRegex:@"[^\u4e00-\u9fa5·|?]"];
if (textField.text.length>8) {
textField.text=[textField.text substringWithRange:NSMakeRange(0, 8)];
}
}
}