xcode swift - 将文本格式化为电话号码[重复]

Posted

技术标签:

【中文标题】xcode swift - 将文本格式化为电话号码[重复]【英文标题】:xcode swift - formatting text as phone number [duplicate] 【发布时间】:2014-12-22 19:22:11 【问题描述】:

我正在使用 Swift 创建一个 iPhone 应用程序。我正在尝试设置一个文本字段,用户可以在其中输入一个电话号码,该电话号码会自动格式化,就像在内置联系人应用程序中键入时一样。我希望 xcode 有这样做的内置方法。

作为替代方案,我创建了自己的代码,可以在用户键入和退格时添加和删除括号、破折号等,但是如果用户要将光标从输入文本的末尾移开,这很快就会出现问题.在联系人应用程序中,如果光标刚好移动到括号之后并且用户按退格键,它不仅会删除括号,还会删除括号前面的数字。我不确定这是否是通过一些内置的格式化方法完成的,或者是否有代码复制删除了括号、破折号等显示的文本并读取光标的位置,然后计算新字符串应该是什么, 并添加新的括号、破折号等。

具体来说,我想知道:

1) 是否有内置方法可以将文本格式化为与联系人应用程序中完全相同的电话号码?

2) 如果没有内置方法,谁能告诉我如何让 Swift 在光标位置读取?

谢谢!

【问题讨论】:

不是链接问题的副本 b/c 它是一种不同的语言。 【参考方案1】:

没有内置的方法可以做到这一点。这是使用UITextFieldshouldChangeCharactersInRange 方法的一种实现:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool

    if textField == phoneTextField
    
        var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
        var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)

        var decimalString = "".join(components) as NSString
        var length = decimalString.length
        var hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (1 as unichar)

        if length == 0 || (length > 10 && !hasLeadingOne) || length > 11
        
            var newLength = (textField.text as NSString).length + (string as NSString).length - range.length as Int

            return (newLength > 10) ? false : true
        
        var index = 0 as Int
        var formattedString = NSMutableString()

        if hasLeadingOne
        
            formattedString.appendString("1 ")
            index += 1
        
        if (length - index) > 3
        
            var areaCode = decimalString.substringWithRange(NSMakeRange(index, 3))
            formattedString.appendFormat("(%@)", areaCode)
            index += 3
        
        if length - index > 3
        
            var prefix = decimalString.substringWithRange(NSMakeRange(index, 3))
            formattedString.appendFormat("%@-", prefix)
            index += 3
        

        var remainder = decimalString.substringFromIndex(index)
        formattedString.appendString(remainder)
        textField.text = formattedString
        return false
    
    else
    
        return true
    

正如之前在这个帖子中回答的那样:UITextField for Phone Number

【讨论】:

以上是关于xcode swift - 将文本格式化为电话号码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串号码格式化为美国电话号码格式

如何将文本重新格式化为不同的模式?

SWIFT:从文本字段格式化为日期不起作用

如何使用 PhoneNumberUtils 库将电话号码格式化为没有国家前缀的国家格式?

React - 如何将电话号码格式化为用户类型

Swift:在自动格式化 UITextField 后动画 UIButton