将UITextField的文本格式化为用户输入的电话号码

时间:2016-03-16 16:50:29

标签: ios swift uitextfield phone-number nsformatter

我有一个自定义的UITextField,我试图将输入格式化为“电话号码”作为用户类型。我想要实现的目标:

  • 在UITextField上添加带前缀+的符号作为第一个无法删除的符号。

  • 以电话号码格式(+ 49 291 12345678)格式化String变量和UITextField的文本,而不是普通数字(4929112345678)用户类型。

我研究并发现没有内置方法。我还发现了一个名为PhoneNumberKit的易于使用的库,用于将输入字符串格式化为电话号码。在Playground中,它的工作方式就像..

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)在控制台上打印格式良好的字符串,但在UI上的UITextField内,它只显示简单的非结构化数字,如“4929112345678”

如果我取消注释,事情开始变得怪异,UITextField开始在UI中显示重复的字符,但是用于打印的控制台日志也变得非常奇怪。我之前尝试清空textField.text = "",但也没有用。

我做错了什么?我错过了哪些不能让它正常工作?我相信这与我有关,而不是图书馆本身。

此外,如果您有任何其他建议(或图书馆)供我解决此问题,请分享。

1 个答案:

答案 0 :(得分:1)

如果要更改要显示的值,则应在替换文本后返回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
}