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

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

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

具体来说,我想知道:

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

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

谢谢!

【问题讨论】:

  • 不是链接问题的副本 b/c 它是一种不同的语言。

标签: iphone xcode swift ios8


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多