iOS textField 字數(shù)限制包含表情校驗和聯(lián)想詞

一個小需求,對輸入的字數(shù)進行限制,超過15個字后不能輸入。其實包括表情、中文聯(lián)想詞。

  • 系統(tǒng)表情占2個字符,如果最后剩一個字符后,如果不做限制表情會展示不全。所以如果剩一個字符就不能輸入。
  • 中文聯(lián)想,在高亮的時候輸入不計算字符。
    網(wǎng)上可以找到很多textView字數(shù)限制的寫法,textField比較少,所以在這做一下記錄。
  1. textfield添加通知 UITextFieldTextDidChangeNotification,用戶在輸入的時候可以進行字數(shù)限制和表情、聯(lián)想詞相關(guān)的操作。
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChangeExt:) name:UITextFieldTextDidChangeNotification object:nil];

以下是字數(shù)限制的實現(xiàn)方法

- (void)textDidChangeExt:(NSNotification *)notification {
    UITextRange *selectedRange = [self.textView markedTextRange];
    // 獲取高亮部分 中文聯(lián)想
    UITextPosition *posi = [self.textView positionFromPosition:selectedRange.start offset:0];
    // 如果在變化中是高亮部分在變,就不要計算字符
    if (selectedRange && posi) {
        return;
    }
    // 實際總長度
    NSInteger realLength = self.textView.text.length;
    
    UITextPosition *beginning = self.textView.beginningOfDocument;
    UITextRange *selectRange = self.textView.selectedTextRange;
    UITextPosition *selectionStart = selectRange.start;
    // 獲取光標的位置
    NSInteger location = [self.textView offsetFromPosition:beginning toPosition:selectionStart];
    // 獲取光標后的文本
    NSString *tailText = [self.textView.text substringFromIndex:location];
    // 光標前允許輸入的最大數(shù)量
    NSInteger restLength = kCWordsMaxLength - tailText.length;

    if (realLength > kCWordsMaxLength) {
        // 解決半個emoji 定位到index位置時,返回在此位置的完整字符的range
        NSRange range = [self.textView.text rangeOfComposedCharacterSequenceAtIndex:restLength];
        NSString *subHeadText = @"";
        // 防止字符串截取越界導(dǎo)致的閃退
        if (range.location > self.textView.text.length || range.location < 0) {
            subHeadText = [self.textView.text substringToIndex:kCWordsMaxLength];
        } else {
            subHeadText = [self.textView.text substringToIndex:range.location];
        }
        self.textView.text = subHeadText;
        // 解決粘貼過多之后,撤銷粘貼 崩潰問題 —— 不會出現(xiàn)彈框
        [self.textView.undoManager removeAllActions];
    }
}

參考鏈接:
iOS開發(fā)之textField和textView限制字數(shù)輸入方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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