带有占位符的 Phone 数字的 UITextField
UITextField for Phone number with placeholder
我正在使用另一个 post 中的以下代码来为美国的 phone 号码格式化 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
}
我建议您在文本字段中使用默认文本。你可以用占位符做同样的事情,我想
将此默认字符串视为一个字符数组。您应该跟踪按下的每个键,并将默认字符串中索引处的字符替换为输入的子字符串(在默认字符串中的该索引处)。当字符被删除时,您应该用该字符 (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" 已得到处理
如果用户使用退格键,它会起作用,但如果范围提前 -1 并且你必须替换的下一个字符是“-”,那么你应该检查它并再次前进 -1,以便替换的字符是肯定 X
询问任何细节。
我正在使用另一个 post 中的以下代码来为美国的 phone 号码格式化 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
}
我建议您在文本字段中使用默认文本。你可以用占位符做同样的事情,我想
将此默认字符串视为一个字符数组。您应该跟踪按下的每个键,并将默认字符串中索引处的字符替换为输入的子字符串(在默认字符串中的该索引处)。当字符被删除时,您应该用该字符 (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" 已得到处理 如果用户使用退格键,它会起作用,但如果范围提前 -1 并且你必须替换的下一个字符是“-”,那么你应该检查它并再次前进 -1,以便替换的字符是肯定 X
询问任何细节。