dome地址
本文主要講解上述dome內(nèi)的使用方法和思路構(gòu)想箫踩。
先說下大致思路(懶得看的可以直接跳過看下邊詳情):
- 使用類目方式給textField和TextView添加監(jiān)控其字符改變時(shí)候页响,來檢測其是否是非法字符和超出長度限制的內(nèi)容刘莹,
- 在添加監(jiān)控時(shí)候,可以多種選擇渔伯,有他們本身的代理,有觀察者,有target敏簿,根據(jù)情況來看,由于代理往往在輸入框的其他地方需要使用,所以這里盡量就要避過輸入框的使用惯裕,因此根據(jù)實(shí)際情況温数,textField選擇Target來進(jìn)行監(jiān)控。而textView并沒有Target蜻势,但是經(jīng)過翻閱API可以看到撑刺,textView 有幾個(gè)關(guān)于輸入內(nèi)容的通知,故握玛,這里的textView選用系統(tǒng)的通知來實(shí)現(xiàn)够傍。
- 然后我們這里分為兩個(gè)部分:對內(nèi)容長度進(jìn)行限制,對內(nèi)容進(jìn)行限制挠铲,這里我們在開始注冊監(jiān)控方法時(shí)候會添加兩個(gè)屬性文本限制的最大長度和內(nèi)容限制的類型冕屯,然后分別進(jìn)行限制。
- 在這里邊有個(gè)問題拂苹,就是本內(nèi)容是通過給輸入框重賦值的方式來進(jìn)行實(shí)現(xiàn)的安聘,因此會出現(xiàn)光標(biāo)位置在一定情況下跑偏的情況,所以瓢棒,加入了另一個(gè)方法浴韭,獲取當(dāng)前光標(biāo)和給當(dāng)前內(nèi)容賦予光標(biāo)位置。解決掉這個(gè)問題脯宿。
注:兩個(gè)控件其實(shí)只有添加監(jiān)控方法上有根本的區(qū)別念颈,其他包括光標(biāo)和限制都是一樣的,但為什么不寫在一起呢连霉,因?yàn)橛械臅r(shí)候需要只調(diào)用其中一個(gè)就可以了舍肠,所以還是分開寫比較好。
接下來是詳情
1.使用類目來進(jìn)行添加方法
這個(gè)就不用詳細(xì)解釋為什么了窘面,因?yàn)槔^承和代理都不太好翠语,需要對原有代碼進(jìn)行大幅改動。
2.添加監(jiān)控
textField
在這里添加了兩個(gè)屬性财边,這里我是用runtime進(jìn)行添加的肌括,具體的不再贅述,大家可以去另外搜索酣难。
上面添加監(jiān)控即用的是Target谍夭,因?yàn)槠鋵?shí)UITextField是繼承于UIControl的一個(gè)子類,故可以直接添加狀態(tài)改變的方法憨募。
textView
從這里可以看出來紧索,蘋果方面對于這些基本的構(gòu)思的還是很合理的
因?yàn)閠extView其實(shí)是繼承于UIScrollView的子類,他沒有Target方法菜谣,所以經(jīng)過選擇后珠漂,發(fā)現(xiàn)用這個(gè)通知是非常合理的晚缩。
這里一樣都添加了兩個(gè)屬性,來進(jìn)行一些設(shè)置的存儲媳危。
3.對內(nèi)容長度和內(nèi)容進(jìn)行限制
對內(nèi)容進(jìn)行限制
說到對內(nèi)容進(jìn)行限制就需要說到這個(gè)枚舉ImportChatType
這里我把這個(gè)枚舉單獨(dú)寫在了一個(gè).h文件里荞彼,因?yàn)閮蓚€(gè)控件都要調(diào)用這個(gè)枚舉,所以將其單獨(dú)寫一個(gè)文件待笑。
后續(xù)在調(diào)用時(shí)候不用調(diào)用這個(gè)枚舉的文件鸣皂,只用調(diào)用對應(yīng)的類目文件即可
這個(gè)枚舉列舉了基本的內(nèi)容限制的功能,同樣暮蹂,后續(xù)可以添加枚舉寞缝,但是添加枚舉時(shí)候一定要同時(shí)添加轉(zhuǎn)換對應(yīng)正則表達(dá)式的方法。
接著就是完成對內(nèi)容進(jìn)行判斷是否是非法的內(nèi)容
判斷完成后返回正確的剩余字符仰泻,在這里即使是復(fù)制過來的字符也可以進(jìn)行每個(gè)字符的甄別荆陆,最后只保留設(shè)置好的字符。
對長度進(jìn)行限制
長度的限制比較簡單我纪,很多地方也都能找到并實(shí)現(xiàn)慎宾,但我這里找到的丐吓,是在于我們輸入中文的時(shí)候拼音會輸入不全浅悉,導(dǎo)致最后沒法輸入,我這里完全沒這個(gè)問題券犁,因?yàn)檫@里是當(dāng)還有未選中字符的時(shí)候术健,不進(jìn)行長度和內(nèi)容的判斷,故可以避開這個(gè)問題粘衬。
4.處理光標(biāo)問題
上圖是核心的兩個(gè)方法荞估,在處理上還是用runtime進(jìn)行添加了一個(gè)屬性,
首先在每次文本改變時(shí)候觸發(fā)方法后先獲取光標(biāo)的位置稚新,然后再經(jīng)過一系列的處理后勘伺,然后再將光標(biāo)賦予回去,這樣就可以保證光標(biāo)始終在用戶當(dāng)前的輸入位置褂删。
調(diào)用
和添加觀察者類似~~
以上就是這個(gè)dome的所有內(nèi)容飞醉,如果有任何意見和建議歡迎提出,謝謝瀏覽屯阀。