欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UITextView限制输入字数

程序员文章站 2022-04-06 12:13:54
...

需求 输入框限制字数
需求下来 想参考一些资源 结果 觉得都不太能满足咱这需求 只能自己写了
想了想 需求清晰 思路也就清晰了
以下是代码

UITextRange *selectedRange = [textView markedTextRange];
    //获取高亮部分
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
    
    NSRange selection = textView.selectedRange;
    
    NSInteger realLength = textView.text.length; //实际总长度
    
    NSString *headText = [textView.text substringToIndex:selection.location]; //光标前的文本
    NSString *tailText = [textView.text substringFromIndex:selection.location];//光标后的文本
    
    NSInteger restLength = self.maxLength - tailText.length; //光标后允许输入的文本长度
    
    if (realLength > self.maxLength) {
        NSString *subHeadText = [headText substringToIndex:restLength];
        textView.text = [subHeadText stringByAppendingString:tailText];
        [textView setSelectedRange:NSMakeRange(restLength, 0)];
    }

运行以上代码尝试一下 是不是觉得有问题??? 当你输中文的时候 甚至不能拼完对不对
问题是什么? 问题是字数限制问题出现了 那么解决问题就显得目标明确得多了
同事高见 显而易见的是当输入中文的时候拼音处于高亮状态
那么 高亮字符不加入字数限制就可以解决问题了 其实这么个判断

    //如果在变化中是高亮部分在变,就不要计算字符了
    if (selectedRange && pos) {
        return;
    }

于是 改善后 代码段如下

- (void)textViewDidChange:(UITextView *)textView{

    UITextRange *selectedRange = [textView markedTextRange];
    //获取高亮部分
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
    
    //如果在变化中是高亮部分在变,就不要计算字符了
    if (selectedRange && pos) {
        return;
    }
    NSRange selection = textView.selectedRange;
    
    NSInteger realLength = textView.text.length; //实际总长度
    
    NSString *headText = [textView.text substringToIndex:selection.location]; //光标前的文本
    NSString *tailText = [textView.text substringFromIndex:selection.location];//光标后的文本
    
    NSInteger restLength = self.maxLength - tailText.length; //光标后允许输入的文本长度
    
    if (realLength > self.maxLength) {
        NSString *subHeadText = [headText substringToIndex:restLength];
        textView.text = [subHeadText stringByAppendingString:tailText];
        [textView setSelectedRange:NSMakeRange(restLength, 0)];
    }

}