记录下,项目中用的两种限制UITextField 的字数的方式,各有利弊。
第一种方式:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange:(UITextField *)textField {
if (textField.tag == 0) {
NSInteger kMaxLength = 15;
NSString *toBeString = textField.text;
NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; //ios7之前使用[UITextInputMode currentInputMode].primaryLanguage
if ([lang isEqualToString:@"zh-Hans"]) { //中文输入
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if (!position) {// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (toBeString.length > kMaxLength) {
NSString *str = [NSString stringWithFormat:@"最多输入%ld个字符!",kMaxLength];
flToast(str);
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
else{//有高亮选择的字符串,则暂不对文字进行统计和限制
}
}else{//中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
}
}
第二种方式:
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSInteger tag = textField.tag;
if (tag == 0 ) {
// 姓名(最多10位)
if (string.length == 0)
return YES;
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > 10) {
return NO;
}
}
if (tag == 1 ) {
// 身份证号(最多18位)
if (string.length == 0)
return YES;
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > 18) {
return NO;
}
NSString *charaSets = @"Xx0123456789";
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:charaSets] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
if (tag == 2 ) {
// 手机号(最多18位)
if (string.length == 0)
return YES;
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > 11) {
return NO;
}
}
return YES;
}