字數限制的問題點在於漢語可以無限漢語聯想詞匯,導致字數限制對於漢字輸入就失去的作用。我們的做法是監聽鍵盤聯想出來的漢子,將其統計:
1 在viewDidLoad里面監聽文本變化的通知
- (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEditChanged:) name:UITextFieldTextDidChangeNotification object:detailAddress]; }
2 實現這個textViewEditChanged:方法
// 監聽文本改變 -(void)textViewEditChanged:(NSNotification *)obj{ UITextField *textField = (UITextField *)obj.object; NSString *toBeString = textField.text; NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 鍵盤輸入模式 NSUInteger maxLength = MaxNumberOfDescriptionChars-curZone.text.length-1;//加上自動定位的地址,上限是45個漢字 if ([lang isEqualToString:@"zh-Hans"]) { // 簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫 UITextRange *selectedRange = [textField markedTextRange]; //獲取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; // 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制 if (!position) { if (toBeString.length > maxLength) { textField.text = [toBeString substringToIndex:maxLength]; } } // 有高亮選擇的字符串,則暫不對文字進行統計和限制 else{ } } // 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況 else{ if (toBeString.length > maxLength) { textField.text = [toBeString substringToIndex:maxLength]; } } }
3 當然,你還需要在textField的delegate方法里面做正常的限制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([string isEqualToString:@""]) { return YES; } NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; if (detailAddress == textField) { NSUInteger maxLength = MaxNumberOfDescriptionChars;//設置文字上限 if ([toBeString length] > maxLength) { textField.text = [toBeString substringToIndex:maxLength]; [Utils showToastWithText:@"超過最大字數限制"]; return NO; } } return YES; }