格式化UITextField的文本作为电话号码作为用户类型
我有一个自定义的UITextField,我试图'格式化输入到电话号码'作为用户类型。我想达到什么:格式化UITextField的文本作为电话号码作为用户类型
添加上的UITextField一个前缀
+
标志作为第一个字符,不能删除。格式二者String变量和的UITextField在电话号码很好(49 291 12345678),而不是普通的数字在(4929112345678)作为用户类型的格式的文本。
我研究发现,没有内置的方法。我还找到了一个易于使用的库,名为PhoneNumberKit,用于将输入字符串格式化为电话号码。在游乐场,它就像..
let rawNumberArray = "+4929112345678"
let phoneNumbers = PartialFormatter().formatPartial(rawNumberArray)
print(phoneNumbers) // "+49 291 12345678"
裸记住,图书馆需要字符串有+
的第一个字符格式正确。
我试着在我的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)
打印格式良好的控制台上的字符串,但里面的UITextField的UI,它只是显示简单的,非结构化的号码,如“4929112345678”
如果我取消它,事情开始变得奇怪,UITextField在UI中开始呈现重复的字符,但控制台日志打印也变得非常奇怪。我也尝试过清空textField.text = ""
,但也没有工作。
我在做什么错?我错过了什么,不让它工作正常?我相信这与我有关,而不是图书馆本身。
此外,如果您有任何其他建议(或库)可以帮助我解决此问题,请分享它们。
如果要更改要显示的值,应在替换文本后返回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()。
编辑:
使用您的代码:如果您更新文本字段的`经`shouldChangeCharactersInRange`功能text`
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
}
我不能完全理解如何使用它'PartialFormatter()。formatPartial(candidateString as String)'。它实际上做了什么?我想在开头添加一个前缀不能被删除的前缀“+”号;并将文本格式设置为电话号码格式(使用PhoneNumberKit对我来说很方便) – senty
请参阅更新,您需要将isCorrectFormat()和callYourFormatMethodHere()替换为您的。 – dichen
我无法完全理解你的方法,也难以实现它来测试它作为candidate.isCorrectFormat()不会让我这样做。但是从打印线来看,我可以说这是为了检测+符号并防止它被删除;我是对还是完全没有道理?所以我需要做的是检测按下的按钮是否是一个数字(不是+号),并相应地像附加到textField。是对的吗? – senty
,你必须从'shouldChangeCharactersInRange'返回'FALSE'。 – rmaddy
我试着将'return true'改为'return false'。有'textField.text =“+ \(updatedTextString作为字符串)”'不幸的是每次我点击'删除'时都会加上'+'符号。我的方法存在逻辑错误,但我无法弄清楚。我很感激,如果你可以添加一个答案,所以我可以尝试 – senty