限制中文字符长度

效果是这样,在一个文本框内,限制字符最大长度为9,当超过这个长度时,即使能输入,也会被截取

_textField = [[UITextField alloc] initWithFrame:CGRectMake(14, 3, kScreenWidth-18, 34)];
_textField.placeholder = @"设置个性昵称(不能超过9个字符)";
_textField.delegate = self;
_textField.textColor = [UIColor grayColor];
_textField.clearButtonMode = UITextFieldViewModeWhileEditing;
[textFieldBg addSubview:_textField];

若是只有英文、数字等字符,可以用

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *str = [NSString stringWithFormat:@"%@",textField.text,string];
    if (str.length > 9) {
        return NO;
    }
    return YES;
}

但若出现汉字时,该方法就失效。需要用其它代替

[_textField addTarget:self action:@selector(limitStrLength:) forControlEvents:UIControlEventEditingChanged];
-(void)limitStrLength:(UITextField *)sender
{
    bool isChinese;//判断当前输入法是否是中文
    if ([[sender.textInputMode primaryLanguage] isEqualToString: @"en-US"]) {
        isChinese = false;
    } else {
        isChinese = true;
    }
    
    if(sender == _textField) {
        NSString *str = [_textField text];
        if (isChinese) { //中文输入法下
            UITextRange *selectedRange = [_textField markedTextRange];
            //获取高亮部分
            UITextPosition *position = [_textField positionFromPosition:selectedRange.start offset:0];
            // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
            if (!position) {
                if ( str.length>=9) {
                    NSString *strNew = [NSString stringWithString:str];
                    [_textField setText:[strNew substringToIndex:9]];
                }
            } else {
                NSLog(@"输入的英文还没有转化为汉字的状态");
            }
        }else{
            if ([str length]>=9) {
                NSString *strNew = [NSString stringWithString:str];
                [_textField setText:[strNew substringToIndex:9]];
            }
        }
    }
}

 然后上边的那个代理方法也可以删除了

原文地址:https://www.cnblogs.com/Apologize/p/5227494.html