UITextView如何精準限制文字輸入長度

weixin_34006468發表於2016-07-08

UITextView如何限制限制文字輸入長度

1. 開發中,經常遇到要限制字串輸入長度的需求,你首先想到的可能會用這個代理方法限制長度

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

結果發現並不能完美限制使用者輸入,原因是使用者選中鍵盤頂部條的聯想文字時不會呼叫這個代理方法 , 所以要尋找其他方法,下面提供一種比較全面完美的解決方案

2. 完美解決方案 -- 監聽文字輸入,超出指定長度時,擷取子串

  • 第一步: textView的文字改變時,會發出通知,我們需要監聽這個通知
    /**

     *  監聽textView的文字改變

     */

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChangeText:) name:UITextViewTextDidChangeNotification object:textView];
  • 第二步: 實現textViewDidChangeText方法,具體限制使用者輸入
  • 中文輸入的時候,需要判斷有沒有markedText(簡體拼音輸入的時候,輸入的拼音還沒有選擇對應的漢字時,輸入框中的輸入的拼音是選中的高亮狀態,這串拼音就是markedText),對這種狀態要做特殊處理,因為這個拼音字串還沒有轉換成漢字字串,不需要做處理,當使用者選擇了拼音對應的漢字時,就需要判斷輸入框的文字進行處理了,具體程式碼如下 :
1455933-3d6fb9f3d999f988.png
Paste_Image.png

/**

 *  監測使用者輸入文字長度

 */

- (void)textViewDidChangeText:(NSNotification *)notification

{

    /**

     *  最大輸入長度,中英文字元都按一個字元計算

     */

    static int kMaxLength = 10;

    

    UITextView *textView = (UITextView *)notification.object;

    NSString *toBeString = textView.text;

     // 獲取鍵盤輸入模式

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

    // 中文輸入的時候,可能有markedText(高亮選擇的文字),需要判斷這種狀態

    // zh-Hans表示簡體中文輸入, 包括簡體拼音,健體五筆,簡體手寫

    if ([lang isEqualToString:@"zh-Hans"]) {

        UITextRange *selectedRange = [textView markedTextRange];

        //獲取高亮選擇部分

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

        // 沒有高亮選擇的字,表明輸入結束,則對已輸入的文字進行字數統計和限制

        if (!position) {

            if (toBeString.length > kMaxLength) {

                // 擷取子串

                textView.text = [toBeString substringToIndex:kMaxLength];

            }

        } else { // 有高亮選擇的字串,則暫不對文字進行統計和限制

            NSLog(@"11111111111111========      %@",position);
    
        }

    } else {

        // 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況

        if (toBeString.length > kMaxLength) {

            // 擷取子串

            textView.text = [toBeString substringToIndex:kMaxLength];

        }

    }

}

  • 第三步 : 在dealloc中移除通知監聽
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  • iOS技術開發交流QQ群: 579572313

相關文章