在日常开发中,难免会遇到UITextField限制输入字符长度的需求,比如:输入手机号时要求只能输入11位,所以简单记录一下。
- 方法一
遵守UITextField协议,并实现其代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.mobileTextField) {
//输入字符的长度
NSInteger length = textField.text.length - range.length + string.length;
if (length > 11) {
return NO;
}
}
return YES;
}
该方法有个缺点,只适合输入英文、数字等字符。输入中文时可能最后一个字符会出现无法输入的情况。所以此时可以使用方法二去解决
- 方法二
该方法是添加一个像UIButton点击事件一样的事件,去监听UITextField的字符输入,当然也可以使用通知去进行监听,原理是一样的。给UITextField添加一个事件:
[self.nameTextField addTarget:self action:@selector(TextFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
实现方法TextFieldDidChanged
- (void)TextFieldDidChanged:(UITextField *)textField
{
//需要限制的长度
NSInteger maxLength = 4;
//输入的内容
NSString *contentText = textField.text;
//获取高亮内容的范围
UITextRange *maskedRange = [textField markedTextRange];
//计算高亮内容的长度
NSInteger maskedTextLength = [textField offsetFromPosition:maskedRange.start toPosition:maskedRange.end];
//没有高亮内容时,对已输入的文字进行操作
if (!maskedTextLength) {
//如果输入的内容长度大于限制的内容长度
if (contentText.length > maxLength) {
//截断长度限制以后的字符,避免截断字符
NSRange range = [contentText rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)];
textField.text = [contentText substringWithRange:range];
}
}
}
重点提一下方法
- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range
{
//此方法用于在字符串的一个range范围内,返回此range范围内完整的字符串的range
}
使用此方法可以避免截断完整字符,比如你输入一个Emoji的时候,如果直接使用substringToIndex去进行截取的话,可能会把Emoji截断而出现乱码的情况