背景:
? ? ?需求中的一個(gè)車輛編輯頁面要求輸入框是大寫格式,且用戶是小寫的字母在輸入后轉(zhuǎn)為大寫遏乔。并不是簡單的將輸入框的鍵盤指定為大寫向图,因?yàn)橛幸恍┫到y(tǒng)外的輸入法如搜狗輸入法等是不可控的。
實(shí)現(xiàn)方式:
輸入框使用UITextfield來實(shí)現(xiàn)的收擦,想要在文字顯示在textfield前就對小寫進(jìn)行轉(zhuǎn)換鞋既,因此遵守UItextField 的UITextFieldDelegate協(xié)議,實(shí)現(xiàn)它的代理方法耍铜,因?yàn)槲覀兌贾肋@個(gè)代理方法是是在文字還沒有出現(xiàn)的時(shí)候的攔截邑闺,如果返回true就是直接輸出了,返回false就不會(huì)直接輸出棕兼,因此我們需要將轉(zhuǎn)換完成后的文字添加到輸入框里陡舅,首先要做的就是先找好文字的輸入位置然后將文字放到textfield的屬性中去并且處理光標(biāo)
如下:
? func textField(_ textField:UITextField, shouldChangeCharactersIn range:NSRange, replacementString string:String) ->Bool{
? ? ? ? if string.count==0|| string ==" "{
? ? ? ? ? ? return true
? ? ? ? }
? ? ? ? let nCharacter = string.unicodeScalars
? ? ? ? var charNum:Int=0
? ? ? ? for i? in nCharacter{
?? ? ? ? ? ? charNum =? Int(i.value)
? ? ? ? ? ? if charNum >96 && charNum <123{
? ? ? ? ? ? ? ? let uppercaseStr = string.uppercased()
? ? ? ? ? ? ? ? let str =? (textField.text!asNSString).substring(to: range.location)
? ? ? ? ? ? ? ? let str2 =? (textField.text!asNSString).substring(from: range.location)
? ? ? ? ? ? ? ? textField.text=String.init(format:"%@%@%@",str,uppercaseStr,str2)
? ? ? ? ? ? ? ? ? rx_updateTextValue.onNext(String.init(format:"%@%@%@",str,uppercaseStr,str2))
? ? ? ? ? ? ? ? let length:Int= str2.count
? ? ? ? ? ? ? ? let endDocument = textField.endOfDocument
? ? ? ? ? ? ? ? let start = textField.position(from: endDocument, offset: -(length))
? ? ? ? ? ? ? ? let end = textField.position(from: endDocument, offset: -(length))
? ? ? ? ? ? ? ? textField.selectedTextRange= textField.textRange(from: start!, to: end!)
?? ? ? ? ? ? ? ?return false
? ? ? ? ? ? }
? ? ? ? ? ? ifrange.location==0{
? ? ? ? ? ? ? fisrNumHandler(String.init(format:"%@",string))
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return true
? ? }
注意:
小寫轉(zhuǎn)為大寫的算法比較簡單,其中 要注意的是 rx_updateTextValue.onNext(String.init(format:"%@%@%@",str,uppercaseStr,str2)) ?一定要寫伴挚,因?yàn)槲沂怯肦XSwift對uitexfield的text與數(shù)據(jù)模型進(jìn)行相互綁定的靶衍,而只有textField有輸入時(shí)才會(huì)有效的對數(shù)據(jù)模型更行,但是我在小寫轉(zhuǎn)大寫后返回了false茎芋,因此會(huì)認(rèn)會(huì)沒有輸入颅眶,所以我要單獨(dú)來通知數(shù)據(jù)模型我的輸入框數(shù)據(jù)發(fā)生了變化。