iOS textfield限制长度,中文占2字符,英文占1字符

     之前遇到一种情况,限制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码的和不能转的分开统计,那么就要遍历字符串,分开一个一个字符,在遍历的时候可以同时确定要截取字符串的位置,代码如下:

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
28
29
30
31
- (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<n;i++){
         c=[s characterAtIndex:i]; //按顺序取出单个字符
         if (isblank(c)){ //判断字符串为空或为空格
             b++;
         } else if (isascii(c)){
             a++;
         } else {
             l++;
         }
         wLen=l+(CGFloat)((CGFloat)(a+b)/2.0);
         NSLog (@ "wLen--%f" ,wLen);
         if (wLen>=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
     }
}

 监听方法如下:

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
28
29
30
31
32
33
34
35
36
-( 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 {
         
     }
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值