近期做個(gè)小小需求的時(shí)候碰到個(gè)小問題
起初以為字?jǐn)?shù)限制而已岩遗,一丟丟的小功能瘟栖,用textView:shouldChangeTextInRange:shouldChangeTextInRange:方法在輸入前判斷是否可變更值即可嗜价。
結(jié)果慢慢的一個(gè)又一個(gè)的坑就出現(xiàn)了。
坑一:
iOS9以下胆描,中文輸入的情況下指煎,點(diǎn)擊聯(lián)想字輸入是不會回調(diào)textView:shouldChangeTextInRange:shouldChangeTextInRange:這個(gè)方法的。
于是尝偎,聯(lián)想詞各種狂點(diǎn)饶火。 一小會輸入框滿滿全是~~~~
好吧。只能在textViewDidChange:方法內(nèi)判斷了致扯。
于是肤寝,唰唰唰在textViewDidChange:中加入三行代碼。
if(textView.text.length>NM_CARREPORT_TEXTLENGTH_MAX){
textView.text=[textView.text substringToIndex:NM_CARREPORT_TEXTLENGTH_MAX];
}
果斷run起來抖僵,開始噼里啪啦的狂敲屏幕自測【其實(shí)是抽空休息來著】鲤看。
“Bon…” crash了!KH骸义桂!
納尼?蹈垢! what are you 弄啥嘞慷吊?!2芴А溉瓶!我玩?zhèn)€textView,你要是crash在string相關(guān)的也就算了。 你特喵崩在array這種玩意上是鬧哪樣Q吣稹<埠辍!
惆悵了半天胞锰,灾锯,好吧,嗅榕,繼續(xù)填坑。吵聪。凌那。
坑二
crash是在textView截?cái)嗟臅r(shí)候出現(xiàn),唔吟逝,setMarkedText:selectedRange:是設(shè)置文字帽蝶,然后內(nèi)部進(jìn)行富文本的替換。
苦思冥想半天块攒,真真是不得其解励稳,為啥崩了。
直到囱井,突然發(fā)現(xiàn)在中文輸入下驹尼,連續(xù)輸入聲母中間會出現(xiàn)空格, 哇咔咔~~ 悟了 O(∩_∩)O哈哈哈~
趕緊驗(yàn)證一下自己的想法庞呕,果然新翎。。住练。
崩潰的原因在于地啰,假設(shè)要設(shè)置的上限是100個(gè)字符,當(dāng)輸入98個(gè)字符以后讲逛,連續(xù)輸入兩個(gè)聲母亏吝,此時(shí)系統(tǒng)自動在中間添加一個(gè)空格,進(jìn)入到textViewDidChanged:中盏混,textView.text的長度變成101蔚鸥,進(jìn)入到截?cái)嘧址倪壿嬛校氐糇詈笠粋€(gè)字符括饶,那么剩余100個(gè)字符的最后一個(gè)是系統(tǒng)自動增加的空格株茶。將整個(gè)串重新賦給textView.text的時(shí)候,系統(tǒng)無法識別空格(特喵的自己生的都不認(rèn)图焰。日了狗了了~~)启盛,于是就華麗麗的崩了。【經(jīng)檢驗(yàn)僵闯,若最后兩個(gè)字符輸入的是形如ch醬紫的卧抗,不會產(chǎn)生空格的連續(xù)字符,就不會有問題】鳖粟。
不過也對社裆,原本textView:shouldChangeTextInRange:shouldChangeTextInRange:就是用來過濾輸入文本的,既然進(jìn)入到textViewDidChange:中了向图,自然文本就是需要的泳秀,豈能容你隨意更改!【so榄攀。 機(jī)智的蘋果偷偷摸摸的在iOS9上更改了聯(lián)想文字輸入的邏輯嗜傅。也走textView:shouldChangeTextInRange:shouldChangeTextInRange:方法了】
問題找到了,接下來就是填坑了檩赢。
機(jī)智如我吕嘀,小小問題豈能難倒,
if(textView.text.length>NM_CARREPORT_TEXTLENGTH_MAX+1){
textView.text=[textView.text substringToIndex:NM_CARREPORT_TEXTLENGTH_MAX+1];
}
哈哈贞瞒。寶寶是不是好機(jī)智偶房,醬紫正常輸入就不會進(jìn)入到該方法了!因?yàn)樵趖extView:shouldChangeTextInRange:shouldChangeTextInRange:中已經(jīng)限制了军浆。 而聯(lián)想輸入棕洋,就讓你多輸入一個(gè)字嘛~ 反正一般人看不出來。
坑三
天真的我低估了我廠QA同學(xué)的敬業(yè)程度瘾敢,居然生生測出這BUG拍冠。 101個(gè)字和100個(gè)字~~~!4氐帧庆杜! 我說同學(xué),你要不要這么屌碟摆。晃财。。典蜕。 一個(gè)個(gè)去數(shù)你也是棒棒噠6鲜ⅰ!愉舔!
既然QA同學(xué)提出意見了钢猛。作為一名敬業(yè)的RD。必須fix掉靶汀命迈!
然而贩绕。。壶愤。 天知道怎么搞淑倾。。征椒。 機(jī)(bai)智(wu)如(liao)我(lai)娇哆,繼續(xù)翻API找去。
咦勃救?碍讨!markedTextRange 這個(gè)是什么鬼?蒙秒!
/* If text can be selected, it can be marked. Marked text represents provisionally
* inserted text that has yet to be confirmed by the user.It requires unique visual
* treatment in its display.If there is any marked text, the selection, whether a
* caret or an extended range, always resides witihin.
*
* Setting marked text either replaces the existing marked text or, if none is present,
* inserts it from the current selection. */
好吧垄开。直譯就是標(biāo)記文本,代表臨時(shí)的插入待用戶確認(rèn)的文本税肪,簡單來說,這個(gè)其實(shí)就是中文輸入時(shí)榜田,高亮的英文部分益兄。。中文輸入下并且有高亮的英文部分時(shí)箭券,這玩意兒就有值了净捅。
到這里,這坑就填一半了辩块。
if(textView.text.length > NM_CARREPORT_TEXTLENGTH_MAX && textView.markedTextRange == nil){
textView.text=[textView.text substringToIndex:NM_CARREPORT_TEXTLENGTH_MAX];
}
呼蛔六,搞定~~