xcode swift - 将文本格式设置为电话号码
问题描述:
我使用Swift创建iPhone应用程序。我正在尝试设置一个文本字段,用户可以在该字段中输入一个电话号码,该电话号码将自动变为格式化,就像在键入内容时一样。我希望xcode有内置的方法来做到这一点。xcode swift - 将文本格式设置为电话号码
作为一种替代方案,我创建了自己的代码,可以添加和删除括号,破折号等作为用户类型和退格,但是如果用户要将光标从输入的末尾移开,很快就会出现问题文本。在联系人应用程序中,如果将光标移动到括号后面并且用户点击退格键,则不仅会删除括号,还会删除前一个数字。我不确定这是用一些内置的格式化方法完成的,还是有可能是复制了括号,破折号等所显示文本的代码,并读取游标的位置,然后计算新字符串应该是什么,并增加了新的括号,破折号等
具体来说,我想知道:
1)是否有一个内置的方法来格式化文本看起来像一个电话号码完全一样在做联系人应用程序?
2)如果没有内置的方法,有人可以告诉我如何让Swift读取光标位置吗?
谢谢!
答
没有内置的方法来做到这一点。下面是一个使用了UITextField
的shouldChangeCharactersInRange
方法一种实现方式:
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
不是链接的问题的副本B/C这是一个不同的语言。 –