项目中遇到对TextField和TextView添加文字限制的功能,下面是实现方法:
1.TextField
之前做限制在textField的协议方法中,但是这样对文字的统计不及时,对联想也不能很好的判断,输入过快很可能会超限制或者崩溃。因此采用通知监听文字改变
2.textView
与textField类似 在textViewDidChange方法中实现
1.TextField
之前做限制在textField的协议方法中,但是这样对文字的统计不及时,对联想也不能很好的判断,输入过快很可能会超限制或者崩溃。因此采用通知监听文字改变
添加通知:
//添加监听通知,限制字数(中英判断) [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:@"UITextFieldTextDidChangeNotification" object:_tf_name];
//文字限制,中文为5个 英文为10个 目前无法处理中英文混杂 会按照当前输入法判断 缺点就是输入五个中文切换成英文还可以输入 如果是做一样的数字限制就没问题了
-(void)textFiledEditChanged:(NSNotification *)noti{ UITextField *textField = (UITextField *)noti.object; NSString *toBeString = textField.text; // 键盘输入模式,此方法在官方不建议使用 可以用[[UIApplication sharedApplication]textInputMode].primaryLanguage代替 NSString *lang = [[textField textInputMode] primaryLanguage]; // 键盘输入模式 if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写 UITextRange *selectedRange = [textField markedTextRange]; //获取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { if (toBeString.length >5) { textField.text = [toBeString substringToIndex:5]; } }else{ // 有高亮选择的字符串,则暂不对文字进行统计和限制 } } // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 else{ if (toBeString.length > 10) { textField.text = [toBeString substringToIndex:10]; } } } //注意移除通知 -(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:_tf_name]; }
2.textView
与textField类似 在textViewDidChange方法中实现
-(void)textViewDidChange:(UITextView *)textView{ int num = (int)(MY_MAX-textView.text.length); // 键盘输入模式,此方法在官方不建议使用 可以用[[UIApplication sharedApplication]textInputMode].primaryLanguage代替 NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; NSLog(@"%@",lang); NSString *toBeString = textView.text; if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写 UITextRange *selectedRange = [textView markedTextRange]; //获取输入文字中的高亮部分 UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) {//高亮部分不存在则直接统计文字 //label为限制字数的文字改变 这里最大输入50字 label.text = [NSString stringWithFormat:@"%zi字",num>=0?num:0]; if (toBeString.length > MY_MAX) { textView.text = [toBeString substringToIndex:MY_MAX]; } }else{ // 有高亮选择的字符串,暂不对文字进行统计和限制 } } // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 else{ label.text = [NSString stringWithFormat:@"%zi字",num>=0?num:0]; if (toBeString.length > MY_MAX) { textView.text = [toBeString substringToIndex:MY_MAX]; } } } //超过限制后将不可输入文字 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]) { [textView resignFirstResponder]; return NO; } NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; if ([lang isEqualToString:@"zh-Hans"]) { UITextRange *selectedRange = [textView markedTextRange]; //获取高亮部分 UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; if (!position) { if ((textView.text.length - range.length + text.length) > MY_MAX){ return NO; }else{ return YES; } }else{ return YES; } } else{ if ((textView.text.length - range.length + text.length) > MY_MAX){ return NO; }else{ return YES; } } }