博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS textfield限制长度,中文占2字符,英文占1字符
阅读量:6813 次
发布时间:2019-06-26

本文共 2467 字,大约阅读时间需要 8 分钟。

     之前遇到一种情况,限制textfield长度,并且要适配多语言,做到,例如中文占2字符,英文占1字符,还有考虑其他语言,网上找了很多方法,不太合适,最后结合网上的方案,修改出了还比较适用。

首先,增加对textfield文字改变的监听,

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];//修改用户名监听,以改变修改按钮的位置

需要记得在最后要移除监听!

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

这里写的监听方法是textFiledEditChanged: 文字改变就会调用该方法,思路就是限制长度,超出就截断字符串,所以要考虑的问题是:1、什么时候超出长度?2、在哪截断。还有一个问题就是,在用拼音输入中文的时候,拼音字母还没转换为中文,但是也会引起变化并调用这个方法,如果在这个方法里面获取textfield的文字,会获取到中文和还没转中文的字母和自动加的空格...所以这个问题需要处理,不然会造成例如最多能输入5个中文(10个英文字母),当你输入了4个中文后,你后面只能输入两个字母来拼出一个中文,这是不合理的。解决方法是不统计这些还未转换到字母,(注:还未转换称之为高亮状态)。

下面解决这些问题:首先,区分中英文的长度(同样适用于多语言),思路是能转ascii码的和不能转的分开统计,那么就要遍历字符串,分开一个一个字符,在遍历的时候可以同时确定要截取字符串的位置,代码如下:

- (CGFloat)countW:(NSString *)s{    int i;CGFloat n=[s length],l=0,a=0,b=0;    CGFloat wLen=0;    unichar c;    for(i=0;i
=4.5&&wLen<5.5) {//设定这个范围是因为,当输入了当输入9英文,即4.5,后面还能输1字母,但不能输1中文 _subLen=l+a+b;//_subLen是要截取字符串的位置 } } if(a==0 && l==0) { _subLen=0; return 0;//只有isblank } else{ return wLen;//长度,中文占1,英文等能转ascii的占0.5 }}

 监听方法如下:

-(void)textFiledEditChanged:(NSNotification *)obj{    @try{                UITextField *textField = _userNameTf;        NSString *str = [[textField text] stringByReplacingOccurrencesOfString:@"?" withString:@""];//输入的字符,包括键盘上高亮的未转成中文的拼音        NSLog(@"str--%@",str);        UITextRange *selectedRange = [textField markedTextRange];        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];//高亮                if (!position) {//没高亮的文字            CGFloat ascLen=[self countW:str];//没高亮,获取长度            NSLog(@"ascLen------------------%f",ascLen);                if (ascLen > 5) {                    NSString *strNew = [NSString stringWithString:str];                    NSLog(@"strNew--%@",strNew);                    NSLog(@"_subLen%f",_subLen);                    if (_subLen==0) {                        _subLen=strNew.length;                    }                    [textField setText:[strNew substringToIndex:_subLen]];                }        }        else{//            NSLog(@"输入的英文还没转化为汉字");//只是高亮,不应该算长度        }            }    @catch(NSException *exception) {        NSLog(@"exception:%@", exception);    }    @finally {            }    }

 

转载于:https://www.cnblogs.com/tcan/p/4624551.html

你可能感兴趣的文章
centos 7的systemctl
查看>>
Android开发之SDCardUtils工具类。java工具详细代码,附源代码。判断SD卡是否挂载等功能...
查看>>
linuxmint
查看>>
win2003和linux里面如何禁ping
查看>>
Mysql InnoDB行锁实现方式
查看>>
cisco的路由器上rip的被动接口,单播更新,水平分隔
查看>>
MySQL主从复制--mysql-proxy实现MySQL-5.6读写分离
查看>>
号外号外:Exchange2010SP2已经发布
查看>>
css background背景拉伸
查看>>
百度地图开发(一)
查看>>
我的友情链接
查看>>
mount 开机自动挂载
查看>>
45、我的C#学习笔记11
查看>>
sqlserver日期函数
查看>>
git rebase vs git merge
查看>>
如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路
查看>>
最新最全linux系统调优指南(centos7.X)
查看>>
我的友情链接
查看>>
ceph luminous 版本 osd掉线处置
查看>>
maven依赖关系中 scope属性含义
查看>>