UITextView如何精準(zhǔn)限制文本輸入長(zhǎng)度

UITextView如何限制限制文本輸入長(zhǎng)度

1. 開(kāi)發(fā)中,經(jīng)常遇到要限制字符串輸入長(zhǎng)度的需求,你首先想到的可能會(huì)用這個(gè)代理方法限制長(zhǎng)度

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

結(jié)果發(fā)現(xiàn)并不能完美限制用戶輸入,原因是用戶選中鍵盤頂部條的聯(lián)想文字時(shí)不會(huì)調(diào)用這個(gè)代理方法 , 所以要尋找其他方法,下面提供一種比較全面完美的解決方案

2. 完美解決方案 -- 監(jiān)聽(tīng)文本輸入,超出指定長(zhǎng)度時(shí),截取子串

  • 第一步: textView的文本改變時(shí),會(huì)發(fā)出通知,我們需要監(jiān)聽(tīng)這個(gè)通知
    /**

     *  監(jiān)聽(tīng)textView的文本改變

     */

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChangeText:) name:UITextViewTextDidChangeNotification object:textView];
  • 第二步: 實(shí)現(xiàn)textViewDidChangeText方法,具體限制用戶輸入
  • 中文輸入的時(shí)候,需要判斷有沒(méi)有markedText(簡(jiǎn)體拼音輸入的時(shí)候,輸入的拼音還沒(méi)有選擇對(duì)應(yīng)的漢字時(shí),輸入框中的輸入的拼音是選中的高亮狀態(tài),這串拼音就是markedText),對(duì)這種狀態(tài)要做特殊處理,因?yàn)檫@個(gè)拼音字符串還沒(méi)有轉(zhuǎn)換成漢字字符串,不需要做處理,當(dāng)用戶選擇了拼音對(duì)應(yīng)的漢字時(shí),就需要判斷輸入框的文字進(jìn)行處理了,具體代碼如下 :
Paste_Image.png

/**

 *  監(jiān)測(cè)用戶輸入文本長(zhǎng)度

 */

- (void)textViewDidChangeText:(NSNotification *)notification

{

    /**

     *  最大輸入長(zhǎng)度,中英文字符都按一個(gè)字符計(jì)算

     */

    static int kMaxLength = 10;

    

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

    NSString *toBeString = textView.text;

     // 獲取鍵盤輸入模式

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

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

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

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

        UITextRange *selectedRange = [textView markedTextRange];

        //獲取高亮選擇部分

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

        // 沒(méi)有高亮選擇的字,表明輸入結(jié)束,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制

        if (!position) {

            if (toBeString.length > kMaxLength) {

                // 截取子串

                textView.text = [toBeString substringToIndex:kMaxLength];

            }

        } else { // 有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制

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

    } else {

        // 中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可,不考慮其他語(yǔ)種情況

        if (toBeString.length > kMaxLength) {

            // 截取子串

            textView.text = [toBeString substringToIndex:kMaxLength];

        }

    }

}

  • 第三步 : 在dealloc中移除通知監(jiān)聽(tīng)
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  • iOS技術(shù)開(kāi)發(fā)交流QQ群: 579572313
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容