按用户键入的格式将UITextField的文本格式设置为电话号码
我有一个自定义的UITextField,我试图“格式化input到电话号码”作为用户types。 我想实现的是:
-
在UITextField中添加一个前缀
+
符号作为第一个字符,不能被删除。 -
以电话号码的格式很好地(+49 291 12345678)格式化stringvariables和UITextField的文本,而不是用户input的普通数字(4929112345678) 。
我研究发现,没有内置的方法。 我还发现了一个名为PhoneNumberKit的易于使用的库,用于将inputstring格式化为电话号码。 在游乐场,它的作品像..
let rawNumberArray = "+4929112345678" let phoneNumbers = PartialFormatter().formatPartial(rawNumberArray) print(phoneNumbers) // "+49 291 12345678"
请记住,图书馆需要string有+
作为第一个字符格式正确。
我试着在我的UITextField上实现它。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if textField == myTextField { let candidateString : NSString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) let updatedTextString : NSString = PartialFormatter().formatPartial(candidateString as String) self.formattedPhoneNumber(updatedTextString, textField: textField) } return true } func formattedPhoneNumber(updatedTextString: NSString, textField: UITextField) { // textField.text = "+\(updatedTextString as String)" print(updatedTextString) }
如果我保留textField.text = "+\(updatedTextString as String)"
评论, print(updatedTextString)
在控制台上打印格式良好的string,但UI内的UITextField,它只是显示普通的,非结构化的数字,如“4929112345678”
如果我取消注释,事情开始变得怪异,UITextField在UI中开始呈现重复的字符,但是用于打印的控制台日志也变得很奇怪。 我也尝试清空textField.text = ""
之前,但也没有工作。
我究竟做错了什么? 我错过了什么,不让它工作正常? 我相信这与我有关,而不是图书馆本身。
此外,如果您有任何其他build议(或图书馆)可以解决此问题,请分享。
如果要更改要显示的值,请在replace文本后返回false
。 这里是一个例子:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if let text = textField.text { print("curText: \(text) range: \(range.location)-\(range.length) string: \(string)" ) let candidate = (text as NSString).stringByReplacingCharactersInRange(range, withString: string) if(!candidate.isCorrectFormat()){ textField.text = callYourFormatMethodHere(); return false } } return true }
你需要实现你自己的isCorrectFormat()和callYourFormatMethodHere()。
编辑:
使用你的代码:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if textField == myTextField { let candidateString : NSString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) let updatedTextString : NSString = PartialFormatter().formatPartial(candidateString as String) self.formattedPhoneNumber(updatedTextString, textField: textField) return false // Return false here } return true }