原文地址:TextField字數(shù)限制處理
純數(shù)字屎暇、字符輸入(不包括粘貼)這樣的字數(shù)限制還是相對比較簡單的帘不,你可以用兩種方法進行處理廉油,
第一種是textfield的delegate實現(xiàn):
第二種是注冊一個通知,在textfield編輯時做處理:
首先你在viewDidLoad中注冊通知
再實現(xiàn)通知里面的方法
但是烫饼,在中文的限制上面情況就復雜了猎塞,當時在調(diào)試的時候,因為使用的是第三方鍵盤杠纵,所以當時沒有發(fā)現(xiàn)問題荠耽,但是在使用系統(tǒng)鍵盤的時候,一下子就蛋疼了....
下面我開始分析一下淡诗,兩者的區(qū)別:
1骇塘、第三方鍵盤在輸入字符時伊履,一般是不會將字符直接輸入到textfield中韩容,而是將字符顯示在它自己的view上方,但是系統(tǒng)鍵盤會直接輸入到textfield中唐瀑,而且它會占2個字符長度群凶,比如你輸入"abcd",在textfield中顯示的是"a b c d"哄辣,并且"a b c d"是處在高亮中的请梢,并不算是真正輸入到textfield中,所以我們不應把高亮的字符計算在內(nèi)力穗,我們應該計算真正輸入的字符
2毅弧、如果我們使用的是delegate做處理的時候,系統(tǒng)中文輸入的時候會有聯(lián)想当窗,但是聯(lián)想的那個字并不會調(diào)用delegate够坐,比如你輸入一個"你",在系統(tǒng)的聯(lián)想里面可能會出現(xiàn)"的","們"這樣的聯(lián)想,但是你選擇"的"的時候元咙,delegate并不會調(diào)用梯影,(尼瑪....),我猜想聯(lián)想輸入應該不算做keyboard所觸發(fā)的事件庶香,所以他并不會觸發(fā)delegate甲棍,但是如果你注冊的是通知,他倒是會調(diào)用赶掖,(還好有救)
另外提醒一下感猛,有時候在自測輸入的時候,要考慮全面倘零,比如粘貼這也是一種輸入唱遭,當時沒考慮,我也是跪了
好了呈驶,分析了主要的區(qū)別下面我們就來看看具體怎么實現(xiàn)吧~
首先拷泽,我們根據(jù)鍵盤的輸入模式進行區(qū)分,英文的比較簡單就和上面一樣袖瞻,直接取最大的字符數(shù)就好了司致,在中文輸入的時候,我們用markedTextRange方法獲取到當前的光標位置聋迎,再用textField positionFromPosition:selectedRange.start offset:0獲取到高亮部分脂矫,然后判斷是否有高亮,這個時候系統(tǒng)會調(diào)用兩次通知方法霉晕,第一次是將高亮的字符輸入庭再,第二次是將高亮的字符轉換成中文輸入(這個時候就沒有高亮了,然后再取最大的字符數(shù))牺堰,但是在iOS7的設備上測試時發(fā)現(xiàn)拄轻,position都不會為nil,在iOS8以上都正常伟葫,但是獲取到光標的range恨搓,卻是正常的
我們可以看到系統(tǒng)的UITextRange,有兩個變量筏养,一個是start斧抱,一個是end,這正是對于的高亮區(qū)域渐溶!
所以既然position不能使用辉浦,那我們干脆就使用range,通過判斷range的存在茎辐,來對文字進行限制處理宪郊。(粘貼也適用)
結果也是棒棒的眉睹!
如果有什么意見或者建議,歡迎大家留言废膘,知識是需要交流的竹海,我相信會有更好更簡潔的方法來處理
這個是我的個人微信公眾號,會不定期發(fā)表一些iOS開發(fā)文章以及疑難問題和我在閱讀技術和非技術書籍的一些感悟丐黄,歡迎大家訂閱斋配!