将 UITextField 的文本格式化为 Phone 用户输入的数字
Formatting UITextField's text as Phone Number as user types in
我有一个自定义 UITextField,我正尝试将其 'format the input to phone number' 作为用户类型。我想达到的目标:
在 UITextField 上添加前缀 +
作为第一个字符,无法删除。
将字符串变量和 UITextField 的文本格式化为 phone 数字格式 (+49 291 12345678) ,而不是纯数字 (4929112345678) 作为用户输入。
我研究了一下,发现没有内置的方法。我还找到了一个名为 PhoneNumberKit 的易于使用的库,用于将输入字符串格式化为 Phone 数字。在 Playground 中,它的工作方式类似于..
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)
在控制台上打印格式良好的字符串,但在 UI 上的 UITextField 内,它只显示普通的非结构化数字像“4929112345678”
如果我取消注释,事情开始变得奇怪,UITextField 开始在 UI 中显示重复的字符,但用于打印的控制台日志也变得很奇怪。我之前也试过清空textField.text = ""
,也没用
我做错了什么?我错过了什么不能让它正常工作?我相信这与我有关,而不是图书馆本身。
此外,如果您有任何其他建议(或库)可以帮助我解决这个问题,请分享。
如果您要更改要显示的值,应该 return 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
}
我有一个自定义 UITextField,我正尝试将其 'format the input to phone number' 作为用户类型。我想达到的目标:
在 UITextField 上添加前缀
+
作为第一个字符,无法删除。将字符串变量和 UITextField 的文本格式化为 phone 数字格式 (+49 291 12345678) ,而不是纯数字 (4929112345678) 作为用户输入。
我研究了一下,发现没有内置的方法。我还找到了一个名为 PhoneNumberKit 的易于使用的库,用于将输入字符串格式化为 Phone 数字。在 Playground 中,它的工作方式类似于..
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)
在控制台上打印格式良好的字符串,但在 UI 上的 UITextField 内,它只显示普通的非结构化数字像“4929112345678”
如果我取消注释,事情开始变得奇怪,UITextField 开始在 UI 中显示重复的字符,但用于打印的控制台日志也变得很奇怪。我之前也试过清空textField.text = ""
,也没用
我做错了什么?我错过了什么不能让它正常工作?我相信这与我有关,而不是图书馆本身。
此外,如果您有任何其他建议(或库)可以帮助我解决这个问题,请分享。
如果您要更改要显示的值,应该 return 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
}