项目中遇到对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;
}
}
}