iOS:UITextField中文輸入法輸入時對字符長度的限制


 

 
如題的問題,又是個讓我抓狂了大半天的問題,還是做個記錄,有與類似問題的同學可參考,但不一定對。具體問題還需具體分析。我遇到的需求是這樣的:有一個輸入框,輸入框內輸入文字,文字字數限制在20字。
 
我采用了UITextField作為我的輸入框控件,並且在委托方法:
 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 
中實現了對字符串的長度限制,實現如下:
 
#define kMaxLength 20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

   NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];

   if (toBeString.length > kMaxLength && range.length!=1){
       textField.text = [toBeString substringToIndex:kMaxLength];
       return NO;

   }
   return YES;
}
 
這樣實現的結果是:對於純字符的統計沒有什么問題,當輸入的字符超過限制時輸入框便截取最大限制長度的字符串。但是,有個問題,當使用拼音輸入法時,該委托方法中的最后一個參數string接受的是輸入的字母,而不是選擇的漢字,造成的結果是,當想輸入文字“我在編程”,輸入拼音“wozaibiancheng”,每輸入一個字母便會進入委托方法,統計的字符長度是字母的長度,實際上漢字還未超過限制長度,但是字母的長度超過了導致無法繼續輸入。
 
而且,致命的是,這個委托方法並不響應,選中候選漢字的過程,這就沒有辦法重新修正字符長度的統計了。
 
 
我剛開始時候並沒有發現
 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 
這個委托方法沒有響應最后拼音到漢字的過程,當我發現這個問題時,問題便也差不多得到了解決。
1、
因為在之前向微博上的一個朋友咨詢時,他告訴我可以注冊這個觀察者 UITextInputCurrentInputModeDidChangeNotification
在它的監聽下可以得到中文。我剛開始時候理解錯了他的意思,以為得到的就是最終選中的漢字,而中間輸入的拼音並不會被得到。但其實這個監聽,比以上的委托方法多了最后一步而已,即從拼音到中文的過程。
 
所以實現的代碼如下。
<1>在init時候注冊notification:
 
[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(textFiledEditChanged:)
                                           name:@"UITextFieldTextDidChangeNotification"
                                         object:myTextField];
 
<2>實現監聽方法:
 
 
-(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 = [textFieldpositionFromPosition:selectedRange.start offset:0];
       // 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
       if (!position) {
           if (toBeString.length > kMaxLength) {
               textField.text = [toBeString substringToIndex:kMaxLength];
           }
       }
       // 有高亮選擇的字符串,則暫不對文字進行統計和限制
       else{
         
       }
   }
   // 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況
   else{
       if (toBeString.length > kMaxLength) {
           textField.text = [toBeString substringToIndex:kMaxLength];
       }
   }
}
 
<3>在dealloc里注銷掉監聽方法,切記!
 
 
-(void)dealloc{
   [[NSNotificationCenter defaultCenter]removeObserver:self
                                           name:@"UITextFieldTextDidChangeNotification"
                                         object:_albumNameTextField];
}

 

2、

 [_expertSignature addTarget:self action:@selector(textFieldDidChangeEditing) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChangeEditing {

    NSString *toBeString = self.expertSignature.text;

    NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];

    if([lang isEqualToString:@"zh-Hans"]){ //簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫

        UITextRange *selectedRange = [self.expertSignature markedTextRange];

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

        if (!position){//非高亮

            if (toBeString.length > kMaxLength) {

                [ToolUtil showHUD:@"您最多可以輸入22個字" duration:2];

                self.expertSignature.text = [toBeString substringToIndex:kMaxLength];

            }

        }

    }else{//中文輸入法以外

        if (toBeString.length > kMaxLength) {

            [ToolUtil showHUD:@"您最多可以輸入22個字" duration:2];

            self.expertSignature.text = [toBeString substringToIndex:kMaxLength];

        }

    }

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM