您的位置:一分快三全天精准计划 > 1分快3全天计划官方网站-编程 > 都会调用这个方法

都会调用这个方法

2019-09-16 14:13

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

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

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

- (NSUInteger)textLengthFromString:(NSString *)string{ return [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];}- textField:(UITextField *)textField shouldChangeCharactersInRange: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;}

以上方法对于监听键盘输入和退格删除都没有问题,但是,当我们使用粘贴或者直接在键盘上面点选文字输入的时候,并不会调用这个方法。不知道Apple这种做法是什么原因,或许是我对这些方法的含义理解不深吧。

图片 1limit-uitextfield-input-word-count.png

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];

添加一个方法:

// 超出限制的时候截断- 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: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]; return str;}

这里使用的是UTF8编码,如此,便可以解决限制UITextField输入文字长度的问题。

本文首发于我的个人博客,欢迎访问:UITextField限制字数的实现

本文由一分快三全天精准计划发布于1分快3全天计划官方网站-编程,转载请注明出处:都会调用这个方法

关键词: