UITextField控制输入长度

有些时候会有控制输入框文字长度的需求,记录一个简单的思路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (string.length == 0) {
return YES;
}

NSInteger limit = 15; // 文本的最大长度
NSString *newStr = [textField.text stringByAppendingString:string]; // 修改之后的新字符串
NSInteger newStrLength = newStr.length;
newStrLength -= [textField textInRange:[textField markedTextRange]].length; // 去掉高亮内容,输入中文拼音的情况

if (newStrLength > limit) {
// 处理composed character, 比如emoji
NSString *tempStr = [newStr substringWithRange:[newStr rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, limit)]];
textField.text = tempStr;
return NO;
}

return YES;
}

有两个坑注意下:

  1. emoji是composed character,它是由多个字符组合,长度不是1。最开始用的substringToIndex会导致最后一个emoji乱码。
  2. 计算长度的时候要去掉中文输入的时候高亮部分