iOS限制textView、textFiled的有效字数

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


例如

这里讲一下之前实现这功能遇到的坑,一般我们计算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()中移除监听事件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容