IOS开发:对TextField或TextView添加文字限制

来源:互联网 发布:linux 下启动smb服务 编辑:程序博客网 时间:2024/05/19 03:43
项目中遇到对TextField和TextView添加文字限制的功能,下面是实现方法:
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;        }    }}


1 0
原创粉丝点击