UITextView设置文字长度

UITextVew:这个控件大家应该很熟了,不多废话今天简单实现一个小功能:

<1>. 限制文字长度,
<2>. 实时显示输入的字数,

第一个:限制文字长度

这个功能比较简单,只要会使用该控件的都会做,所以这里就简单带过了,

方法一:监听通知
UITextViewTextDidChangeNotification 
方法二:使用代理UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView

然后使用这个方法截取就可以

[self.text substringToIndex:self.maxInputLength]

第二个:实时显示输入的字数

这个功能按照我自己写的思路记录的,并不是步骤

第一步:使用代理监听文字改变并记录修改
#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView
{
    self.textNumLabel.text = [NSString stringWithFormat:@"%ld/200",textView.text.length];
}
UITextView设置文字长度_第1张图片
计算的数字是错误的

问题:键盘是中文时未输出的文字也计算了,继续修改

第二步:判断键盘是否是中文键盘,然后计算输出文字长度
#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView
{
    NSString *InputMethodType = [[UIApplication sharedApplication]textInputMode].primaryLanguage;
    if ([InputMethodType isEqualToString:@"zh-Hans"]) {
        UITextRange *selectedRange = [textView markedTextRange];
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
        if (position == nil) {
            self.textNumLabel.text = [NSString stringWithFormat:@"%ld/200",textView.text.length];
        }
    }else{
        self.textNumLabel.text = [NSString stringWithFormat:@"%ld/200",textView.text.length];
    }
}

问题:文字长度截取正确,但是数字显示不对,这里没有录制视频,简单说一下原因:
封装的分类内部字符串截取方法调用时间是在下面代理后面,就是先计算再截取的

- (void)textViewDidChange:(UITextView *)textView
UITextView设置文字长度_第2张图片
image.png
第三步:改用KVO监听

--->添加观察者

[_contentTextView addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];

--->实现回调(把刚刚在代理里面的方法复制过来就可以)

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"text"]) {
        NSString *InputMethodType = [[UIApplication sharedApplication]textInputMode].primaryLanguage;
        if ([InputMethodType isEqualToString:@"zh-Hans"]) {
            UITextRange *selectedRange = [self.contentTextView markedTextRange];
            UITextPosition *position = [self.contentTextView  positionFromPosition:selectedRange.start offset:0];
            if (position == nil) {
                self.textNumLabel.text = [NSString stringWithFormat:@"%ld/200",self.contentTextView .text.length];
            }
        }else{
            self.textNumLabel.text = [NSString stringWithFormat:@"%ld/200",self.contentTextView .text.length];
        }
    }
}

--->移除

- (void)dealloc
{
    [_contentTextView removeObserver:self forKeyPath:@"text"];
}

OK,收工!
如果大家有更好的方法和建议可以留言给我,一起交流

你可能感兴趣的:(UITextView设置文字长度)