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; i<toBeString.length; ++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; i<toBeString.length; ++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;

}


我的問題基本解決


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章