×
广告

UITextField限制字数的实现

96
vinnyxiong
2016.03.29 09:21* 字数 350

1.常用实现方法

iOS开发中,UITextField限制输入字数,我们可以重写UITextFieldDelegate中的方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text

每当有键盘事件改变UITextField的内容时,都会调用这个方法,如果要超出限制要禁止输入,返回NO即可。
实现方式如下:

- (NSUInteger)textLengthFromString:(NSString *)string
{
    return [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if ([string length] > 0){
        NSString *textFieldString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        if ([self textLengthFromString:textFieldString] > NameMaxLength){
            return NO;
        } else {
            return  YES;
        }
    }
    return YES;
}

2.遇到的问题

以上方法对于监听键盘输入和退格删除都没有问题,但是,当我们使用粘贴或者直接在键盘上面点选文字输入(如下图)的时候,并不会调用这个方法。不知道Apple这种做法是什么原因,或许是我对这些方法的含义理解不深吧。

limit-uitextfield-input-word-count.png

3.解决方案

UITextField还可以监听很多的事件,这些事件是由UIControlEvents提供的,适用于UITextField的事件如下:

    UIControlEventEditingDidBegin     = 1 << 16,     // UITextField
    UIControlEventEditingChanged      = 1 << 17,
    UIControlEventEditingDidEnd       = 1 << 18,
    UIControlEventEditingDidEndOnExit = 1 << 19,     // 'return key' ending editing

对此,我们可以监听UIControlEventEditingChanged事件,

[self.nameTextField addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];

添加一个方法:

// 超出限制的时候截断
- (void)textFieldEditChanged:(UITextField *)textField
{
    if(textField.markedTextRange == nil && [self textLengthFromString:textField.text] > NameMaxLength)
    {
        NSString *content = [self string:textField.text subStrWithUtf8Len:NameMaxLength];
        textField.text = content;
    }
}

UITextField中的内容改变的时候就会调用这个方法,如果超出了限制的长度,那么会对字符串进行截断,截断的方法如下:

// 按照长度截断字符串
- (NSString *)string:(NSString *)string subStrWithUtf8Len:(int)maxLen
{
    int strlen = 0;
    NSUInteger len = [string length];
    int i= 0;
    for(i= 0; i< maxLen ; i++) {
        if(i< len) {
            unichar wchar = [string characterAtIndex:i];
            if(wchar <= 127) {
                strlen++;
            } else {
                strlen += 3;
            }
            if(strlen > maxLen) {
                break;
            }
        } else {
            break;
        }
    }
    if(i <= 0) {
        return string;
    }
    NSString * str = [string substringWithRange:NSMakeRange(0,i)];
    return str;
}

这里使用的是UTF8编码,如此,便可以解决限制UITextField输入文字长度的问题。

本文首发于我的个人博客,欢迎访问:UITextField限制字数的实现

Web note ad 1