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];
}
计算的数字是错误的

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

第二步:判断键盘是否是中文键盘,然后计算输出文字长度
#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
image.png
第三步:改用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,收工!
如果大家有更好的方法和建议可以留言给我,一起交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,009评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,232评论 4 61
  • 【书名】《你要么出众,要么出局》 【作者】李尚龙 【金句】这辈子要么努力地按照想法去活,要么习惯了按照活法去想,要...
    盈盈_0db6阅读 409评论 0 0
  • 凉风微习 我想起年少情动 行走半生不忘的人 在我荒凉的岁月里留白 温暖疗愈窗台 枝丫上寻欢 喝酒总是不醉的人啊 青...
    秦吾侬阅读 260评论 0 3
  • 首先大部分智商是不是天定的,它是后天习得的。当我们把习得的知识实践应用到生活中去的时候,智商就开始成长了。 概念与...
    穆建园阅读 377评论 0 0