UITextField限制字数的实现

1.常用实现方法

iOS开发中,UITextField限制输入字数,我们可以重写UITextFieldDelegate中的方法:

1
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text

每当有键盘事件改变UITextField的内容时,都会调用这个方法,如果要超出限制要禁止输入,返回NO即可。
实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (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的事件如下:

1
2
3
4
UIControlEventEditingDidBegin     = 1 << 16,     // UITextField
UIControlEventEditingChanged = 1 << 17,
UIControlEventEditingDidEnd = 1 << 18,
UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing

对此,我们可以监听UIControlEventEditingChanged事件,

1
[self.nameTextField addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];

添加一个方法:

1
2
3
4
5
6
7
8
9
// 超出限制的时候截断
- (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中的内容改变的时候就会调用这个方法,如果超出了限制的长度,那么会对字符串进行截断,截断的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 按照长度截断字符串
- (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输入文字长度的问题。

您的支持将鼓励我继续创作!
0%