1, 使用NSNotification监控变化:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChanged:) name:UITextFieldTextDidChangeNotification object:nil];
2,文本变化事件回调:
- (void)textFieldDidChanged:(NSNotification *)notification { if (_wordsMaxCount > 0) { UITextField *textField = _input_text_textField; NSString *toBeString = textField.text; NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式 if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写 UITextRange *selectedRange = [textField markedTextRange]; //获取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; if (!position || !selectedRange) { // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 textField.text = [self getString:toBeString withCountLimit:_wordsMaxCount]; } else { // 有高亮选择的字符串,则暂不对文字进行统计和限制 } } else { // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 textField.text = [self getString:toBeString withCountLimit:_wordsMaxCount]; } } }
3, 字符串截取函数:
- (NSString *)getString:(NSString *)toBeString withCountLimit:(NSInteger)limit { NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSData *toBeStringData = [toBeString dataUsingEncoding:encoding]; NSInteger dataLength = [toBeStringData length]; if (dataLength > limit) { NSString *limitString = nil; while (!limitString) { limitString = [[NSString alloc] initWithData:[toBeStringData subdataWithRange:NSMakeRange(0, limit)] encoding:encoding]; limit --; if (limit <= 0) break; } return limitString; } return toBeString; }
4,移除Notification监控
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];