iOS UITextView 限制字数(解决了截断输入联想和对系统键盘中文不友好的问题)

原贴出处:http://blog.csdn.net/z794614061/article/details/53821798

个人认为是目前最好的截断方式!

解决的问题有:
1.截断汉字对中文输入不友好的问题(比如要输入最后一个汉字“讲”,输入字母j之后就不让你输入了。注:在系统自带键盘中文会出现这个问题)
2.我已经输入满了,此时光标放在文字中间,再输入就会顶掉后面的字。需求当然是删掉你正在输入的字,已完美解决。


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

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行以上代码尝试一下 是不是觉得有问题??? 当你输中文的时候 甚至不能拼完对不对
问题是什么? 问题是字数限制问题出现了 那么解决问题就显得目标明确得多了
同事高见 显而易见的是当输入中文的时候拼音处于高亮状态
那么 高亮字符不加入字数限制就可以解决问题了 其实这么个判断

    //如果在变化中是高亮部分在变,就不要计算字符了
    if (selectedRange && pos) {
        return;
    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

于是 改善后 代码段如下

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

}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

欢迎拍砖。。。��

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值