关于 UITextField 限制输入字符

在日常开发中,难免会遇到UITextField限制输入字符长度的需求,比如:输入手机号时要求只能输入11位,所以简单记录一下。

  • 方法一
    遵守UITextField协议,并实现其代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.mobileTextField) {
        //输入字符的长度
        NSInteger length = textField.text.length - range.length + string.length;
        if (length > 11) {
            return NO;
        }
    }
    return YES;
}

该方法有个缺点,只适合输入英文、数字等字符。输入中文时可能最后一个字符会出现无法输入的情况。所以此时可以使用方法二去解决

  • 方法二
    该方法是添加一个像UIButton点击事件一样的事件,去监听UITextField的字符输入,当然也可以使用通知去进行监听,原理是一样的。给UITextField添加一个事件:
[self.nameTextField addTarget:self action:@selector(TextFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];

实现方法TextFieldDidChanged

- (void)TextFieldDidChanged:(UITextField *)textField
{
    //需要限制的长度
    NSInteger maxLength = 4;
    //输入的内容
    NSString *contentText = textField.text;
    //获取高亮内容的范围
    UITextRange *maskedRange = [textField markedTextRange];
    //计算高亮内容的长度
    NSInteger maskedTextLength = [textField offsetFromPosition:maskedRange.start toPosition:maskedRange.end];
    //没有高亮内容时,对已输入的文字进行操作
    if (!maskedTextLength) {
        //如果输入的内容长度大于限制的内容长度
        if (contentText.length > maxLength) {
            //截断长度限制以后的字符,避免截断字符
            NSRange range = [contentText rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)];
            textField.text = [contentText substringWithRange:range];
        }
    }
}

重点提一下方法

- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range
{
//此方法用于在字符串的一个range范围内,返回此range范围内完整的字符串的range
}

使用此方法可以避免截断完整字符,比如你输入一个Emoji的时候,如果直接使用substringToIndex去进行截取的话,可能会把Emoji截断而出现乱码的情况

你可能感兴趣的:(关于 UITextField 限制输入字符)