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];
}
问题:键盘是中文时未输出的文字也计算了,继续修改
第二步:判断键盘是否是中文键盘,然后计算输出文字长度
#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
第三步:改用KVO监听
--->添加观察者
[_contentTextView addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
--->实现回调(把刚刚在代理里面的方法复制过来就可以)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)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,收工!
如果大家有更好的方法和建议可以留言给我,一起交流