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

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


猜你喜欢

转载自blog.csdn.net/qishiai819/article/details/50203419