IOS textfield 限制汉字输入的方法

这几天在做设置昵称  但是限制汉字输入为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 = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式


这儿方法

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

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

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

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


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

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

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

int chNum =0;

        for (int i=0; ilength; ++i)

        {

            NSRange range = NSMakeRange(i, 1);

            NSString *subString = [toBeString substringWithRange:range];

            const char *cString = [subString UTF8String];

            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 用来判断   

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:)

                                                name:@"UITextFieldTextDidChangeNotification"

                                              object:_suqareName];


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


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

    NSString *toBeString = textField.text;

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

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

        

        UITextRange *selectedRange = [textField markedTextRange];

        //获取高亮部分

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

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

        int chNum =0;

        for (int i=0; ilength; ++i)

        {

            NSRange range = NSMakeRange(i, 1);

            NSString *subString = [toBeString substringWithRange:range];

            const char *cString = [subString UTF8String];

            if (strlen(cString) == 3)

            {

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

                chNum ++;

            }

        }

        

        if (chNum>=9) {

            _canedit =NO;

        }

        

        if (!position) {

            if (toBeString.length > 10) {

                textField.text = [toBeString substringToIndex:10];

                _canedit =YES;

            }

        }

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

        else{

        }

    }

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

    else{

        if (toBeString.length > 20) {

            textField.text = [toBeString substringToIndex:20];

            _canedit =NO;

        }

    }

}


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

{

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

    if (toBeString.length<=10) {

        _canedit =YES;

    }

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

        return NO;

    }

    return YES;

}


我的问题基本解决


你可能感兴趣的:(IOS知识点)