IOS textfield 限制汉字输入的方法

来源:互联网 发布:机器视觉算法工程师 编辑:程序博客网 时间:2024/05/16 06:56

这几天在做设置昵称  但是限制汉字输入为10个的时候,发现不太好做,原有的方法限制的只是字符串的长度,但是我们再输入汉字的时候打字拼音的长度也被计算了,有时候输入拼音太长就会被中断,,很麻烦  

例如  中国龙(zhonguolong) 实际只有三个字  但是拼音太长直接被砍掉  


我在网上找到一些解决方法  但实际都不理想   在他们的基础上有研究了一个上午,勉强可以复合我自己的要求


如下:首先  获取键盘模式  

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeMode:)name:@"UITextInputCurrentInputModeDidChangeNotification" object:nil];

然后实现上面的方法:

-(void) changeMode:(NSNotification *)notification{

NSLog(@"%@",[[UITextInputMode currentInputMode] primaryLanguage]);

}

这样就能拿到值了。
下面是LOG结果:

2011-07-18 14:32:48.565 UIFont[2447:207] zh-Hans //简体汉字拼音

2011-07-18 14:32:50.784 UIFont[2447:207] en-US   //英文

2011-07-18 14:32:51.344 UIFont[2447:207] zh-Hans //简体手写

2011-07-18 14:32:51.807 UIFont[2447:207] zh-Hans //简体笔画

2011-07-18 14:32:53.271 UIFont[2447:207] zh-Hant //繁体手写

2011-07-18 14:32:54.062 UIFont[2447:207] zh-Hant //繁体仓颉

2011-07-18 14:32:54.822 UIFont[2447:207] zh-Hant //繁体笔画


这是键盘的输入模式打印
我们在代码中只要写着个就可以获取

NSString *lang = [[UITextInputModecurrentInputMode] primaryLanguage];// 键盘输入模式


这儿方法

 UITextRange *selectedRange = [textFieldmarkedTextRange]; 获取字符的range 

//获取高亮部分  的position  也就是拼音输入的那部分

 UITextPosition *position = [textFieldpositionFromPosition:selectedRange.startoffset:0];

        //没有高亮选择的字,则对已输入的文字进行字数统计和限制


还需要了解汉字字符串  的关系  获取字符串中汉字的个数   

UTF8编码:汉字占3个字节,英文字符占1个字节

NSString *toBeString = @"how to go to 中国";

int chNum =0;

       for (int i=0; i<toBeString.length; ++i)

        {

           NSRange range = NSMakeRange(i,1);

           NSString *subString = [toBeString substringWithRange:range];

           const char *cString = [subStringUTF8String];

           if (strlen(cString) ==3)

            {

               NSLog(@"汉字:%@",subString);

                chNum ++;

            }

        }

另一种方法

char 值处于区间[19968, 19968+20902]里的,都是汉字

Unicode的官方可以查到这些编码 
for(int i=0; i< [str length];i++){

int a = [str characterAtIndex:i];

if( a > 0x4e00 && a < 0x9fff)

NSLog(@"汉字");
}
得到字符串中的每一个char,char 值大于255的可以看作是汉字 



//有了这些准备  就基本解决问题了

在ViewDidload 中注册  不要忘记在 dealloc 中remove 掉通知

_canedit 为一个BOOL 用来判断   

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(textFiledEditChanged:)

                                               name:@"UITextFieldTextDidChangeNotification"

                                             object:_suqareName];


-(void)textFiledEditChanged:(NSNotification *)obj{


   UITextField *textField = (UITextField *)obj.object;

   NSString *toBeString = textField.text;

    NSString *lang = [[UITextInputModecurrentInputMode] primaryLanguage];// 键盘输入模式

    if ([langisEqualToString:@"zh-Hans"]) {// 简体中文输入,包括简体拼音,健体五笔,简体手写

        

       UITextRange *selectedRange = [textField markedTextRange];

       //获取高亮部分

       UITextPosition *position = [textField positionFromPosition:selectedRange.startoffset:0];

        //没有高亮选择的字,则对已输入的文字进行字数统计和限制

       int chNum =0;

       for (int i=0; i<toBeString.length; ++i)

        {

           NSRange range = NSMakeRange(i,1);

           NSString *subString = [toBeString substringWithRange:range];

           const char *cString = [subStringUTF8String];

           if (strlen(cString) ==3)

            {

               NSLog(@"汉字:%@",subString);

                chNum ++;

            }

        }

        

       if (chNum>=9) {

           _canedit =NO;

        }

        

       if (!position) {

           if (toBeString.length >10) {

                textField.text = [toBeStringsubstringToIndex:10];

               _canedit =YES;

            }

        }

        //有高亮选择的字符串,则暂不对文字进行统计和限制

       else{

        }

    }

    //中文输入法以外的直接对其统计限制即可,不考虑其他语种情况

   else{

       if (toBeString.length >20) {

            textField.text = [toBeStringsubstringToIndex:20];

           _canedit =NO;

        }

    }

}


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

   NSString * toBeString = [textField.textstringByReplacingCharactersInRange:range withString:string]; //得到输入框的内容    

   if (toBeString.length<=10) {

       _canedit =YES;

    }

    if (_canedit==NO) { //如果输入框内容大于20则弹出警告

       return NO;

    }

    return YES;

}


我的问题基本解决


1 0