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

标签 ios swift uitextfield phone-number nsformatter

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

  • 在 UITextField 上添加前缀 + 作为第一个字符,不能删除。

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


我研究了一下,发现没有内置的方法。我还找到了一个名为 PhoneNumberKit 的易于使用的库,用于将输入字符串格式化为电话号码。在 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) 在控制台上打印格式良好的字符串,但在 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()。

编辑:

使用您的代码:

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
}

关于ios - 在用户输入时将 UITextField 的文本格式化为电话号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36042018/

相关文章:

ios - Xcode 中的几个目标

javascript - v4 : pinch zooming a map when one finger is over a child element 中的 d3.js 缩放传播

iphone - UITextField 的 iOS 5 和 iOS 6 行为在 KeyboardType Email 的情况下不同

swift - 从 UITextfield 强制解包选项

ios - 约束 UICollectionView 高度以匹配内容的高度

ios - UIAccessibilityCustomAction 选择器 - 为什么返回 BOOL

ios - iPhone 的临时文件目录有多安全?

iOS 如何在 UITextView 中内联插入 UITextField

xcode - 为什么 viewDidLoad 在 didSelectItemAtIndexPath 之前运行?

iphone - 如何将背景图像放入 iPhone 中的文本字段和 TextView ?