iOS 限制输入字数完美解决方案

关于限制输入字数以前也做过,网上也很多方法。

但都不够完美,以前的测试人员也没千方百计的挑毛病,所以就糊弄过去了。

现在这个项目的测试人员为了找bug真是无所不用其极。。。。

1.一般方法就是通过UITextField的代理方法

#pragma mark - UITextFieldDelegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.textFieldName) {
        if (string.length == 0) return YES;

        NSInteger existedLength = textField.text.length;
        NSInteger selectedLength = range.length;
        NSInteger replaceLength = string.length;
        if (existedLength - selectedLength + replaceLength > 20) {
            return NO;
        }
    }

    return YES;
}

but这个方法还是有bug的。。。这个方法很容易被中文的联想、粘贴等方式突破限制长度。

2.给UITextField加事件,然后在事件里截取至最大长度

[self.textFieldName addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChange:(UITextField *)textField
{
    if (textField == self.textFieldName) {
        if (textField.text.length > 15) {
            textField.text = [textField.text substringToIndex:15];
        }
    }
}

你以为这样搞定了中文联想、粘贴的bug,就高枕无忧了吗。。。这方法还是有bug的,如果输入至还剩一个字符时,再输入Emoji呢?Emoji占2个字符,会被截得出现半个Emoji的情况,含半个Emoji的字符串在URL编码时会变为nil。

3.限制输入字数完美解决方案

其实就是在方案2上做了调整

- (void)textFieldDidChange:(UITextField *)textField
{
    if (textField == self.textFieldName) {
        if (textField.text.length > 15) {
        UITextRange *markedRange = [textField markedTextRange];
           if (markedRange) {
              return;
           }
//Emoji占2个字符,如果是超出了半个Emoji,用15位置来截取会出现Emoji截为2半 //超出最大长度的那个字符序列(Emoji算一个字符序列)的range NSRange range = [textField.text rangeOfComposedCharacterSequenceAtIndex:15]; textField.text = [textField.text substringToIndex:range.location]; } } }

 

转载于:https://my.oschina.net/zhanglinfengzlf/blog/699205

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值