iOS UITextField限制輸入長度不能超過最大字元數(需要考慮中英文的情況)
阿新 • • 發佈:2019-02-14
_walletNameTextField = [[CommonTextField alloc] initWithText:nil placeHolder:NSLocalizedString(@"設定錢包名稱(不超過25個字元)", nil)];
[_walletNameTextField addTarget:self action:@selector(textFiledDidChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textFiledDidChanged:(UITextField *)textField {
if (kMaxNumber == 0)
return;
NSString *toBeString = textField.text;
NSString *lang = [[textField textInputMode] primaryLanguage]; // 鍵盤輸入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫
//判斷markedTextRange是不是為Nil,如果為Nil的話就說明你現在沒有未選中的字元,
//可以計算文字長度。否則此時計算出來的字元長度可能不正確
UITextRange *selectedRange = [textField markedTextRange];
//獲取高亮部分(感覺輸入中文的時候才有)
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
if (!position) {
//中文和字元一起檢測 中文是兩個字元
if ([toBeString getStringLenthOfBytes] > kMaxNumber) {
textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];
}
}
} else {
if ([toBeString getStringLenthOfBytes] > kMaxNumber) {
textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];
}
}
}
#define kMaxNumber 25
// NSString分類方法:
- (NSInteger)getStringLenthOfBytes {
NSInteger length = 0;
for (int i = 0; i < [self length]; i++) {
//擷取字串中的每一個字元
NSString *s = [self substringWithRange:NSMakeRange(i, 1)];
if ([self validateChineseChar:s]) {
length += 2;
} else {
length += 1;
}
}
return length;
}
- (NSString *)subBytesOfstringToIndex:(NSInteger)index {
NSInteger length = 0;
NSInteger chineseNum = 0;
NSInteger zifuNum = 0;
for (int i = 0; i < [self length]; i++) {
//擷取字串中的每一個字元
NSString *s = [self substringWithRange:NSMakeRange(i, 1)];
if ([self validateChineseChar:s]) {
if (length + 2 > index) {
return [self substringToIndex:chineseNum + zifuNum];
}
length += 2;
chineseNum += 1;
} else {
if (length + 1 > index) {
return [self substringToIndex:chineseNum + zifuNum];
}
length += 1;
zifuNum += 1;
}
}
return [self substringToIndex:index];
}
//檢測中文或者中文符號
- (BOOL)validateChineseChar:(NSString *)string {
NSString *nameRegEx = @"[\\u0391-\\uFFE5]";
if (![string isMatchesRegularExp:nameRegEx]) {
return NO;
}
return YES;
}
//檢測中文
- (BOOL)validateChinese:(NSString *)string {
NSString *nameRegEx = @"[\u4e00-\u9fa5]";
if (![string isMatchesRegularExp:nameRegEx]) {
return NO;
}
return YES;
}
- (BOOL)isMatchesRegularExp:(NSString *)regex {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:self];
}