UITextField對(duì)中英文混合輸入進(jìn)行字?jǐn)?shù)限制

最近開發(fā)設(shè)置昵稱功能的時(shí)候遇到一個(gè)問題,需要對(duì)textfield中中英文字?jǐn)?shù)進(jìn)行限制,并且中文的長度算作2,顯然直接使用[string length]是不行了。相信很多同仁也都遇到過這個(gè)問題。那就不墨跡啦,直接上代碼吧。
首先,擴(kuò)展NSString,增加對(duì)中文的判斷,代碼如下


@interface NSString (Chinese)

- (BOOL)isChinese;

@end

@implementation NSString (Chinese)

- (BOOL)isChinese
{
    NSString *match = @"(^[\u4e00-\u9fa5]+$)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
    return [predicate evaluateWithObject:self];
}

@end

對(duì)UITextField的Delegate方法進(jìn)行處理,


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableString *originalText = [NSMutableString stringWithString:textField.text];
    __block NSInteger originalTextLength = 0;
    //如果是替換操作,則把需要替換的substring刪除
    if (range.length > 0) {
        [originalText deleteCharactersInRange:range];
    }
    //枚舉原始string中的每一個(gè)字符,計(jì)算此原始string的長度,這部分string是不需要改變的
    [originalText enumerateSubstringsInRange:NSMakeRange(0, originalText.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        //如果是中文,就是將長度*2
        if ([substring isChinese]) {
            originalTextLength += [substring length] * 2;
        } else {
            originalTextLength += [substring length];
        }
    }];
    
    __block BOOL overrange = NO;
    //如果是替換操作,這里的string是替換的字符串,如果不是替換操作,這里的string是增加的字符串。枚舉這部分string中的每一個(gè)字符,進(jìn)行特殊處理
    [string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
        //同上
        if ([substring isChinese]) {
            originalTextLength += [substring length] * 2;
        } else {
            originalTextLength += [substring length];
        }
        
        //如果字符串長度在限制范圍內(nèi),就將枚舉的字符添加到原始string中,否則認(rèn)為是超越了長度限制并停止枚舉
        if (originalTextLength <= TEXTFIELD_INPUTCHAR_MAX_COUNT) {
            [originalText appendString:substring];
        } else {
            overrange = YES;
            *stop = YES;
        }
    }];
    
    //如果上面超出了長度限制,就將調(diào)整后的string重新設(shè)置到textfield中
    if (overrange) {
        textField.text = originalText;
        return NO;
    }
    return YES;
}

最后,只需要定義你自己的字?jǐn)?shù)限制TEXTFIELD_INPUTCHAR_MAX_COUNT就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容