按用户键入的格式将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 }