最近開發(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就可以了。