限制字?jǐn)?shù)的textview

好久沒(méi)有寫文章了,今天上來(lái)寫寫信殊,發(fā)現(xiàn)增多了markDown編輯器秧廉。挺不錯(cuò)伞广,后續(xù)研究一下,今天暫寫文章先疼电。好了嚼锄,不廢話。

如題蔽豺,相信大家看到這個(gè)標(biāo)題都不想看文章了区丑,這有什么好說(shuō)的,網(wǎng)上一搜一大把修陡。好吧沧侥,自認(rèn)為是一搜一大把的跳過(guò),有興趣的就看完魄鸦。宴杀。。拾因。旺罢。。

對(duì)于限制UITextView輸入的字符數(shù)绢记。相信大家在網(wǎng)上見(jiàn)得最多的是實(shí)現(xiàn)UITextViewDelegate

[objc]?view plain?copy

-?(BOOL)textView:(UITextView?*)textView?shouldChangeTextInRange:(NSRange)range??

?replacementText:(NSString?*)text;//有輸入時(shí)觸但對(duì)于中文鍵盤出示的聯(lián)想字選擇時(shí)不會(huì)觸發(fā)??


-?(void)textViewDidChange:(UITextView?*)textView;//當(dāng)輸入且上面的代碼返回YES時(shí)觸發(fā)扁达。或當(dāng)選擇鍵盤上的聯(lián)想字時(shí)觸發(fā)蠢熄。??

第一個(gè)用于限制輸入跪解,第二個(gè)用于動(dòng)態(tài)計(jì)算剩余字?jǐn)?shù)。好吧签孔,就來(lái)慢慢的給大家分析這兩個(gè)代理共同協(xié)作來(lái)限制輸入惠遏。

從最簡(jiǎn)單的開(kāi)始砾跃。為了便于講析,聲明

#define MAX_LIMIT_NUMS?100 來(lái)限制最大輸入只能100個(gè)字符

詳細(xì)的實(shí)現(xiàn)代碼:

[objc]?view plain?copy

-?(BOOL)textView:(UITextView?*)textView?shouldChangeTextInRange:(NSRange)range??

?replacementText:(NSString?*)text??

{??

NSString?*comcatstr?=?[textView.text?stringByReplacingCharactersInRange:range?withString:text];??


NSInteger?caninputlen?=?MAX_LIMIT_NUMS?-?comcatstr.length;??


if?(caninputlen?>=?0)??

????{??

return?YES;??

????}??

else??

????{??

NSInteger?len?=?text.length?+?caninputlen;??

//防止當(dāng)text.length?+?caninputlen?<?0時(shí)节吮,使得rg.length為一個(gè)非法最大正數(shù)出錯(cuò)??

NSRange?rg?=?{0,MAX(len,0)};??


if?(rg.length?>?0)??

????????{??

NSString?*s?=?[text?substringWithRange:rg];??


[textView?setText:[textView.text?stringByReplacingCharactersInRange:range?withString:s]];??

????????}??

return?NO;??

????}??


}??


-?(void)textViewDidChange:(UITextView?*)textView??

{??

NSString??*nsTextContent?=?textView.text;??

NSInteger?existTextNum?=?nsTextContent.length;??


if?(existTextNum?>?MAX_LIMIT_NUMS)??

????{??

//截取到最大位置的字符??

NSString?*s?=?[nsTextContent?substringToIndex:MAX_LIMIT_NUMS];??


[textView?setText:s];??

????}??


//不讓顯示負(fù)數(shù)??

self.lbNums.text?=?[NSString?stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS?-?existTextNum),MAX_LIMIT_NUMS];??

}??

最終運(yùn)行效果:

圖片這么大?^_^判耕。大家看到這是不是就表示OK了呢透绩。就提交代碼了呢?

好壁熄,下面就對(duì)上面的簡(jiǎn)單代進(jìn)行逐一BUG找出且進(jìn)行修復(fù)帚豪。

1.遺留BUG(只考慮了英文鍵盤下處理)

? 上述代碼在英文鍵盤下基本上是可以正常,但如果是在中文(生在天朝啊必須得懂中文)或9宮格鍵盤下會(huì)有什么問(wèn)是呢草丧。下圖是我截圖狸臣,當(dāng)輸入到只剩下一個(gè)字時(shí),這時(shí)輸入拼音時(shí)昌执,問(wèn)題出現(xiàn)了烛亦,發(fā)現(xiàn)拼音輸不完。另一個(gè)問(wèn)題是當(dāng)離字?jǐn)?shù)上限差距很大時(shí)懂拾,輸入拼音會(huì)發(fā)現(xiàn)字?jǐn)?shù)也跟著計(jì)算了煤禽。本來(lái)還沒(méi)有輸入的,此時(shí)開(kāi)始計(jì)算了岖赋,有瘕次檬果。

如圖,在最后一個(gè)唐断,本想輸入一個(gè)拼音h開(kāi)頭的且還沒(méi)有出現(xiàn)在推薦字的选脊。哪再輸入第二位拼音時(shí)發(fā)現(xiàn)不能輸了,且字?jǐn)?shù)被計(jì)算了脸甘。

對(duì)上述可能有朋友說(shuō)恳啥,這算什么BUG〗锍蹋基本上沒(méi)怎么碰到這情況角寸。嗯確實(shí),但如果是在一段字中間插入的時(shí)候呢忿墅。這個(gè)是有可能出現(xiàn)的扁藕。

哪么怎么樣處理這樣的產(chǎn)生的BUG呢。從分析來(lái)看事實(shí)上輸入拼音還處于高亮狀態(tài)疚脐,哪么有沒(méi)有什么辦法來(lái)獲取呢亿柑。于是呼搜尋中。棍弄。望薄。疟游。。痕支。

Ok,確實(shí)有這樣的好颁虐。加上后代碼如下:

[objc]?view plain?copy

-?(BOOL)textView:(UITextView?*)textView?shouldChangeTextInRange:(NSRange)range??

?replacementText:(NSString?*)text??

{??

UITextRange?*selectedRange?=?[textView?markedTextRange];??

//獲取高亮部分??

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

//獲取高亮部分內(nèi)容??

//NSString?*?selectedtext?=?[textView?textInRange:selectedRange];??


//如果有高亮且當(dāng)前字?jǐn)?shù)開(kāi)始位置小于最大限制時(shí)允許輸入??

if?(selectedRange?&&?pos)?{??

NSInteger?startOffset?=?[textView?offsetFromPosition:textView.beginningOfDocument?toPosition:selectedRange.start];??

NSInteger?endOffset?=?[textView?offsetFromPosition:textView.beginningOfDocument?toPosition:selectedRange.end];??

????????NSRange?offsetRange?=?NSMakeRange(startOffset,?endOffset?-?startOffset);??


if?(offsetRange.location?<?MAX_LIMIT_NUMS)?{??

return?YES;??

????????}??

else??

????????{??

return?NO;??

????????}??

????}??



NSString?*comcatstr?=?[textView.text?stringByReplacingCharactersInRange:range?withString:text];??


NSInteger?caninputlen?=?MAX_LIMIT_NUMS?-?comcatstr.length;??


if?(caninputlen?>=?0)??

????{??

return?YES;??

????}??

else??

????{??

NSInteger?len?=?text.length?+?caninputlen;??

//防止當(dāng)text.length?+?caninputlen?<?0時(shí),使得rg.length為一個(gè)非法最大正數(shù)出錯(cuò)??

NSRange?rg?=?{0,MAX(len,0)};??


if?(rg.length?>?0)??

????????{??

NSString?*s?=?[text?substringWithRange:rg];??


[textView?setText:[textView.text?stringByReplacingCharactersInRange:range?withString:s]];??

//既然是超出部分截取了卧须,哪一定是最大限制了另绩。??

self.lbNums.text?=?[NSString?stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];??

????????}??

return?NO;??

????}??


}??


-?(void)textViewDidChange:(UITextView?*)textView??

{??

UITextRange?*selectedRange?=?[textView?markedTextRange];??

//獲取高亮部分??

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


//如果在變化中是高亮部分在變,就不要計(jì)算字符了??

if?(selectedRange?&&?pos)?{??

return;??

????}??


NSString??*nsTextContent?=?textView.text;??

NSInteger?existTextNum?=?nsTextContent.length;??


if?(existTextNum?>?MAX_LIMIT_NUMS)??

????{??

//截取到最大位置的字符??

NSString?*s?=?[nsTextContent?substringToIndex:MAX_LIMIT_NUMS];??


[textView?setText:s];??

????}??


//不讓顯示負(fù)數(shù)?口口日??

self.lbNums.text?=?[NSString?stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS?-?existTextNum),MAX_LIMIT_NUMS];??

}??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末花嘶,一起剝皮案震驚了整個(gè)濱河市笋籽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椭员,老刑警劉巖车海,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隘击,居然都是意外死亡侍芝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闸度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)竭贩,“玉大人,你說(shuō)我怎么就攤上這事莺禁×袅浚” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵哟冬,是天一觀的道長(zhǎng)楼熄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浩峡,這世上最難降的妖魔是什么可岂? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮翰灾,結(jié)果婚禮上缕粹,老公的妹妹穿的比我還像新娘。我一直安慰自己纸淮,他們只是感情好平斩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咽块,像睡著了一般绘面。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天揭璃,我揣著相機(jī)與錄音晚凿,去河邊找鬼。 笑死瘦馍,一個(gè)胖子當(dāng)著我的面吹牛歼秽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播情组,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哲银,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呻惕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滥比,失蹤者是張志新(化名)和其女友劉穎亚脆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盲泛,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡濒持,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寺滚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柑营。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖村视,靈堂內(nèi)的尸體忽然破棺而出官套,到底是詐尸還是另有隱情,我是刑警寧澤蚁孔,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布奶赔,位于F島的核電站,受9級(jí)特大地震影響杠氢,放射性物質(zhì)發(fā)生泄漏站刑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一鼻百、第九天 我趴在偏房一處隱蔽的房頂上張望绞旅。 院中可真熱鬧,春花似錦温艇、人聲如沸因悲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囤捻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝎土,已是汗流浹背视哑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誊涯,地道東北人挡毅。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暴构,于是被迫代替她去往敵國(guó)和親跪呈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容