经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS 输入框限制输入字节数
来源:cnblogs  作者:yuyuyu37  时间:2018/10/20 15:25:11  对本文有异议

iOS中限制输入框文字长度的方法有好多,百度一下,最常用的是这种:

  1. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  2. if ([textField isEqual:self.nameTextField]) {
  3. NSString *whole = [NSString stringWithFormat:@"%@%@",textField.text, string];
  4. if (range.length == 1 && string.length == 0) {
  5. return YES;
  6. }
  7. if ([whole dataUsingEncoding:NSUTF8StringEncoding].length > 14) {
  8. [textField resignFirstResponder];
  9. MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
  10. return NO;
  11. }
  12. }
  13. return YES;
  14. }

但是这种方法有bug,当输入最后一个汉字的时候,只能输入拼音不能变成汉字。

经过仔细的搜索之后会发现另一中方法:

  1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.nameTextField];
  1. - (void)textFieldDidChange:(NSNotification *)noti {
  2. NSString *language = [[UITextInputMode currentInputMode] primaryLanguage];
  3. NSString *string = self.nameTextField.text;
  4. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  5. if ([language rangeOfString:@"zh-Hans"].length != 0 || [language rangeOfString:@"zh-Hant"].length != 0) {
  6. UITextRange *selectedRange = self.nameTextField.markedTextRange;
  7. UITextPosition *position = [self.nameTextField positionFromPosition:selectedRange.start offset:0];
  8. if (!position) {
  9. if (data.length > 14) {
  10. self.nameTextField.text = [string substringToIndex:14];
  11. [self.nameTextField resignFirstResponder];
  12. MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
  13. }
  14. } else {
  15. }
  16. } else {
  17. if ([self.nameTextField.text dataUsingEncoding:NSUTF8StringEncoding].length > 14) {
  18. [self.nameTextField resignFirstResponder];
  19. MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
  20. }
  21. }
  22. }

这种方法没有前面说的那种bug,会截取指定长度字符串,但是如果是中英文混合输入的话就没办法根据字节数计算对应的字符串长度,我们希望超过指定字节数时,截取到最后一次输入之前的长度。

可以将上面两种方法结合起来来实现我们的需求:

  1. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  2. if (range.length != 0) { self.lastInputStringRange = range; }
  3. return YES;
  4. }
  5. - (void)textFieldDidChange:(NSNotification *)noti {
  6. NSString *language = [[UITextInputMode currentInputMode] primaryLanguage];
  7. NSString *string = self.nameTextField.text;
  8. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  9. if ([language rangeOfString:@"zh-Hans"].length != 0 || [language rangeOfString:@"zh-Hant"].length != 0) {
  10. UITextRange *selectedRange = self.nameTextField.markedTextRange;
  11. UITextPosition *position = [self.nameTextField positionFromPosition:selectedRange.start offset:0];
  12. if (!position) {
  13. if (data.length > 14) {
  14. self.nameTextField.text = [string substringToIndex:self.lastInputStringRange.location];
  15. [self.nameTextField resignFirstResponder];
  16. MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
  17. }
  18. } else {
  19. }
  20. } else {
  21. if ([self.nameTextField.text dataUsingEncoding:NSUTF8StringEncoding].length > 14) {
  22. self.nameTextField.text = [string substringToIndex:14];
  23. [self.nameTextField resignFirstResponder];
  24. MAKE_TOAST_TOP(LOCALIZESTRING(@"NameLimit"));
  25. }
  26. }
  27. }

 

使用变量lastInputStringRange记录最近一次输入的范围,超过指定范围截取字符串时,截取到该位置即可。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号