Swift2 带有占位符的电话号码的UITextField

Swift2 带有占位符的电话号码的UITextField,swift2,uitextfield,ios9.3,Swift2,Uitextfield,Ios9.3,我正在使用另一篇文章中的以下代码格式化美国电话号码的UITextField,但当用户开始键入而不是清除文本时,我希望占位符保持不变。例如,输入后的+1(XXX)XXX-XXXX应与+1(23X)XXX-XXXX类似。 我不希望完全清除占位符,而是希望它作为用户指南 我当前使用的代码: func textFieldDidBeginEditing(textField: UITextField) { if (textField == self.mobileNumberTextField

我正在使用另一篇文章中的以下代码格式化美国电话号码的
UITextField
,但当用户开始键入而不是清除文本时,我希望占位符保持不变。例如,输入后的+1(XXX)XXX-XXXX应与+1(23X)XXX-XXXX类似。 我不希望完全清除占位符,而是希望它作为用户指南

我当前使用的代码:

    func textFieldDidBeginEditing(textField: UITextField) {
    if (textField == self.mobileNumberTextField) {
        textField.text = "+"
    }
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if (textField == self.mobileNumberTextField) {
        let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)

        if (newString.characters.count < textField.text?.characters.count && newString.characters.count >= 1) {
            return true                                                         // return true for backspace to work
        } else if (newString.characters.count < 1) {
            return false;                        // deleting "+" makes no sence
        }
        if (newString.characters.count > 17 ) {
            return false;
        }

        let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)

        let decimalString = components.joinWithSeparator("") as NSString
        let length = decimalString.length

        var index = 0
        let formattedString = NSMutableString()
        formattedString.appendString("+")

        if (length >= 1) {
            let countryCode = decimalString.substringWithRange(NSMakeRange(0, 1))
            formattedString.appendString(countryCode)
            index += 1
        }

        if (length > 1) {
            var rangeLength = 3
            if (length < 4) {
                rangeLength = length - 1
            }
            let operatorCode = decimalString.substringWithRange(NSMakeRange(1, rangeLength))
            formattedString.appendFormat(" (%@) ", operatorCode)
            index += operatorCode.characters.count
        }

        if (length > 4) {
            var rangeLength = 3
            if (length < 7) {
                rangeLength = length - 4
            }
            let prefix = decimalString.substringWithRange(NSMakeRange(4, rangeLength))
            formattedString.appendFormat("%@-", prefix)
            index += prefix.characters.count
        }

        if (index < length) {
            let remainder = decimalString.substringFromIndex(index)
            formattedString.appendString(remainder)
        }

        textField.text = formattedString as String

        if (newString.characters.count == 17) {
            textField.resignFirstResponder()
        }

        return false
    }

    return true
}
func textfielddebeginediting(textField:UITextField){
if(textField==self.mobileNumberTextField){
textField.text=“+”
}
}
func textField(textField:UITextField,shouldChangeCharactersRange:NSRange,replacementString:string)->Bool{
if(textField==self.mobileNumberTextField){
让newString=(textField.text!作为NSString)。StringByReplacingCharactersRange(range,withString:string)
if(newString.characters.count=1){
return true//return true使退格生效
}else if(newString.characters.count<1){
return false;//删除“+”没有意义
}
如果(newString.characters.count>17){
返回false;
}
让components=newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().InversedSet)
让decimalString=components.joinWithSeparator(“”)作为NSString
let length=小数字符串.length
var指数=0
让formattedString=NSMutableString()
formattedString.appendString(“+”)
如果(长度>=1){
让countryCode=decimalString.substringWithRange(NSMakeRange(0,1))
formattedString.appendString(国家代码)
指数+=1
}
如果(长度>1){
变量rangeLength=3
如果(长度<4){
rangeLength=长度-1
}
let operatorCode=decimalString.substringWithRange(NSMakeRange(1,rangeLength))
formattedString.appendFormat((@)”,运算符代码)
索引+=运算符code.characters.count
}
如果(长度>4){
变量rangeLength=3
如果(长度<7){
rangeLength=长度-4
}
让prefix=decimalString.substringWithRange(NSMakeRange(4,rangeLength))
formattedString.appendFormat(“%@-”,前缀)
索引+=前缀.characters.count
}
如果(索引<长度){
让余数=decimalString.substringFromIndex(索引)
formattedString.appendString(余数)
}
textField.text=格式化字符串为字符串
if(newString.characters.count==17){
textField.resignFirstResponder()辞职
}
返回错误
}
返回真值
}

我建议您在textfield中使用默认文本。我想你们也可以用占位符

将此默认字符串视为一个字符数组。您应该跟踪每个按下的键,并将默认字符串中索引处的字符替换为输入的子字符串(在默认字符串中该索引处)。当删除字符时,应将其替换回该字符(X)

尝试以下方法:

var defaultstring = "+1 (XXX) XXX-XXXX"
var yourtextField = UITextField()

override func viewDidLoad() {
  yourtextField.text = defaultstring
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
   if string != "" {
        var range = self.defaultstring.rangeOfString("X")

        self.defaultstring.replaceRange(range!, with: string)
        self.yourtextField.text = self.defaultstring
// I tested, this is working. 
    }

    else if substring == "" {
        // THis case if when user presses backspace.. 
        let idx = self.defaultstring.characters.indexOf("X")?.advancedBy(-1)
        let range = self.defaultstring.rangeOfComposedCharacterSequenceAtIndex(idx!)
        self.defaultstring.replaceRange(range, with: "X")

    }

}
此代码可以工作,但有些事情需要注意,例如: 结束情况,用户键入的字符数超过允许的字符数 仅将“X”替换为键入的字符已得到处理 如果用户使用backSpace,它将起作用,但是如果范围前进了-1,您必须替换的下一个字符是“-”,那么您应该检查该字符并再次前进了-1,这样要替换的字符肯定是X

询问任何细节