iOS限制textView、textFiled的有效字数

在开发中我们常常需要再某些地方限制用户的输入字数的功能。


iOS限制textView、textFiled的有效字数_第1张图片
例如

这里讲一下之前实现这功能遇到的坑,一般我们计算textView、textFiled输入字数的时候,一般是判断已经输入的字符的长度,这种判断方式对于英文、数字或其他字符的时候没问题,但对于中文时问题就来了。当使用的是系统键盘时,当你正在输入拼音,还没拼完的时候,突然发现不能输入了,字符的长度已经超出你限制的最大值了。。原来是输入拼音还处于高亮状态时也同时被计算进长度了,这就尴尬了,所以我们需要再拼音正在输入时,忽略计算高亮的字符。 下面是解决办法,以textview为例:

如果是textview,则用下面方法进行监听输入

[[NSNotificationCenter defaultCenter]addObserver:self
                                        selector:@selector(textViewEditChanged:)
                                            name:@"UITextViewTextDidChangeNotification"  
                                          object:self]; 

//计算输入字符长度

-(void)textViewEditChanged:(NSNotification *)obj{
    //获取正在输入的textView
    UITextView *textView = (UITextView *)obj.object;
    NSString *toBeString = textView.text;
    NSString *lang = [textView.textInputMode primaryLanguage];
    if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
        UITextRange *selectedRange = [textView markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
        // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if (!position) {
            if (toBeString.length > self.kMaxLength) {
                [LSToast showTip:[NSString stringWithFormat:@"长度最长可设置%zd个字",self.kMaxLength]];
                textView.text = [toBeString substringToIndex:self.kMaxLength];
                [self endEditing:YES];
            }
        }
        // 有高亮选择的字符串,则暂不对文字进行统计和限制
        else{ 
        }
    }
    // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
    else{
        if (toBeString.length > self.kMaxLength) {
            [LSToast showTip:[NSString stringWithFormat:@"长度最长可设置%zd个字",self.kMaxLength]];
            textView.text = [toBeString substringToIndex:self.kMaxLength];
            [self endEditing:YES];
        }
    }
}

//如果是textField,则用下面监听方法

{
 [[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(textFiledEditChanged:)
                                             name:@"UITextFieldTextDidChangeNotification"
                                           object:self];
}

最候记得再dealloc()中移除监听事件。

你可能感兴趣的:(iOS限制textView、textFiled的有效字数)