UItextview的textViewDidChange的使用技巧

UItextview在项目中的使用:
一般在项目中使用这个控件,是为了实现像下面的效果。下面我们就来一起实现一下。

在这里插入图片描述
在.h文件里面

{
    UITextView *tvRemark; // 反馈内容
    UILabel *labNumber; // 字数
}

在.m文件里面

- (void)viewDidLoad {
// 输入内容
      UIView *viewRemark = [[UIView alloc] init];
     viewRemark.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:viewRemark];
    
    UILabel *labRemark = [[UILabel alloc] init];
    labRemark.text = @"反馈内容";
    labRemark.font = [UIFont systemFontOfSize:15];
    labRemark.textColor = [UIColor blackColor];
    [viewRemark addSubview:labRemark];
    
    UILabel *labTag = [[UILabel alloc] init];
    labTag.textColor = [UIColor redColor];
    labTag.text = @"*";
    [viewRemark addSubview:labTag];
    
    tvRemark = [[UITextView alloc] init];
    tvRemark.font = [UIFont systemFontOfSize:13];
    tvRemark.delegate = self;
    [viewRemark addSubview:tvRemark];
    // _placeholderLabel
    UILabel *placeHolderLabel = [[UILabel alloc] init];
    placeHolderLabel.text = @"请填写10字以上的问题描述,以便我们更好地帮助您解决问题";
    placeHolderLabel.numberOfLines = 0;
    placeHolderLabel.textColor = [UIColor lightGrayColor];
    [placeHolderLabel sizeToFit];
    placeHolderLabel.font = [UIFont systemFontOfSize:13.f];
    [tvRemark addSubview:placeHolderLabel];
    [tvRemark setValue:placeHolderLabel forKey:@"_placeholderLabel"];
    labNumber = [[UILabel alloc] init];
    labNumber.textColor = [UIColor lightTextColor];
    labNumber.font = [UIFont systemFontOfSize:13];
    labNumber.text = @"0/200";
    [viewRemark addSubview:labNumber];
    
    // 下面使用的是Masonry第三方的 SDK进行的控件的布局
    [viewRemark mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(viewPic.mas_bottom).offset(10);
        make.height.mas_equalTo(168);
        make.width.mas_equalTo(SCREEN_WIDTH);
    }];
    
    [labRemark mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(15);
        make.top.mas_equalTo(viewRemark.mas_top).offset(8);
        make.height.mas_equalTo(20);
    }];
    
    [labTag mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(labRemark.mas_right).offset(5);
        make.top.bottom.mas_equalTo(labRemark);
    }];
    
    [tvRemark mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(15);
        make.right.mas_equalTo(-15);
        make.top.mas_equalTo(labRemark.mas_bottom).offset(8);
        make.height.mas_equalTo(100);
    }];
    [labNumber mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.mas_equalTo(-15);
        make.top.mas_equalTo(tvRemark.mas_bottom).offset(8);
        make.height.mas_equalTo(15);
        make.bottom.mas_equalTo(viewRemark.mas_bottom).offset(-20);
    }];
}

下面的代码是比较重要的,方法是textview的UITextViewDelegate。是控制输入文字数量的变化。

在.m文件里面

-(void)textViewDidChange:(UITextView *)textView{
    NSString *lang = textView.textInputMode.primaryLanguage; // 键盘输入模式

        if ([lang isEqualToString:@"zh-Hans"]){

            UITextRange *selectedRange = [textView markedTextRange];

            if (!selectedRange) { // 没有高亮

                if (textView.text.length>200) { // 输入的文字大于设定的长度  这里设置的是200个字符
                    tvRemark.text = [textView.text substringToIndex:200];
                }else{
                    tvRemark.text = textView.text;
                }
                labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)textView.text.length];

            }else{
            }
        }else{
            if (textView.text.length>200) {
                tvRemark.text = [textView.text substringToIndex:200];
            }else{
                tvRemark.text = textView.text;
            }
            labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)textView.text.length];
        }
}

tvRemark是初始化的UItextview; labNumber是要显示输入文字多少的UIlabel控件。其中

[lang isEqualToString:@"zh-Hans"]  这句话是要判断是否是中文,防止英文同步计算在内。
selectedRange  判断TextView是否处于高亮选中的状态。
textView.text.length 表示当前输入的文本的数量。

在之后的使用过程中,同事发现了问题。使用上面的-(void)textViewDidChange:(UITextView *)textView会出现一句话中间输入之后直接跳转到末尾的问题。于是进行了修改。如下:

-(void)textViewDidChange:(UITextView *)textView{
    NSString *lang = textView.textInputMode.primaryLanguage;//键盘输入模式

        if ([lang isEqualToString:@"zh-Hans"]){

            UITextRange *selectedRange = [textView markedTextRange];

            if (!selectedRange) {//已经标记的文本

                if (textView.text.length>200) {
                    self.tvRemark.text = [textView.text substringToIndex:200];
                }
            }
        }else{

            if (textView.text.length>200) {
                self.tvRemark.text = [textView.text substringToIndex:200];
            }
        }
            
    self.labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)self.tvRemark.text.length];
            
    if (_delegate && [_delegate respondsToSelector:@selector(CtextViewTextChange:)]) {
         [self.delegate CtextViewTextChange:self.tvRemark.text];
    }
}

通过以上的代码就可以实现UItextview常用的页面状态了。如果上面的代码在多个地方使用,建议新建一个类,将代码进行统一管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为包租婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值