1.常用实现方法
iOS开发中,UITextField
限制输入字数,我们可以重写UITextFieldDelegate
中的方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
每当有键盘事件改变UITextField
的内容时,都会调用这个方法,如果要超出限制要禁止输入,返回NO
即可。
实现方式如下:
- (NSUInteger)textLengthFromString:(NSString *)string
{
return [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string length] > 0){
NSString *textFieldString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if ([self textLengthFromString:textFieldString] > NameMaxLength){
return NO;
} else {
return YES;
}
}
return YES;
}
2.遇到的问题
以上方法对于监听键盘输入和退格删除都没有问题,但是,当我们使用粘贴或者直接在键盘上面点选文字输入(如下图)的时候,并不会调用这个方法。不知道Apple
这种做法是什么原因,或许是我对这些方法的含义理解不深吧。
3.解决方案
UITextField
还可以监听很多的事件,这些事件是由UIControlEvents
提供的,适用于UITextField
的事件如下:
UIControlEventEditingDidBegin = 1 << 16, // UITextField
UIControlEventEditingChanged = 1 << 17,
UIControlEventEditingDidEnd = 1 << 18,
UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing
对此,我们可以监听UIControlEventEditingChanged
事件,
[self.nameTextField addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];
添加一个方法:
// 超出限制的时候截断
- (void)textFieldEditChanged:(UITextField *)textField
{
if(textField.markedTextRange == nil && [self textLengthFromString:textField.text] > NameMaxLength)
{
NSString *content = [self string:textField.text subStrWithUtf8Len:NameMaxLength];
textField.text = content;
}
}
当UITextField
中的内容改变的时候就会调用这个方法,如果超出了限制的长度,那么会对字符串进行截断,截断的方法如下:
// 按照长度截断字符串
- (NSString *)string:(NSString *)string subStrWithUtf8Len:(int)maxLen
{
int strlen = 0;
NSUInteger len = [string length];
int i= 0;
for(i= 0; i< maxLen ; i++) {
if(i< len) {
unichar wchar = [string characterAtIndex:i];
if(wchar <= 127) {
strlen++;
} else {
strlen += 3;
}
if(strlen > maxLen) {
break;
}
} else {
break;
}
}
if(i <= 0) {
return string;
}
NSString * str = [string substringWithRange:NSMakeRange(0,i)];
return str;
}
这里使用的是UTF8
编码,如此,便可以解决限制UITextField
输入文字长度的问题。
本文首发于我的个人博客,欢迎访问:UITextField限制字数的实现