iOS UITextView 限制字数

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

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)];
    }

}

欢迎拍砖。。。��

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值