iOS:UITextField中文IME輸入時對字元長度的限制

來源:互聯網
上載者:User

標籤:

  如題的問題,又是個讓我抓狂了大半天的問題,還是做個記錄,有與類似問題的同學可參考,但不一定對。具體問題還需具體分析。我遇到的需求是這樣的:有一個輸入框,輸入框內輸入文字,文字字數限制在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;
} 這樣實現的結果是:對於純字元的統計沒有什麼問題,當輸入的字元超過限制時輸入框便截取最大限制長度的字串。但是,有個問題,當使用拼音IME時,該委託方法中的最後一個參數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{
         
       }
   }
   // 中文IME以外的直接對其統計限制即可,不考慮其他語種情況
   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{//中文IME以外

        if (toBeString.length > kMaxLength) {

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

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

        }

    }

}

 

 

iOS:UITextField中文IME輸入時對字元長度的限制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.