我希望用户以•••••••••的格式输入社会安全号码。 用户键入前3个数字,然后手动附加空格。然后他们再输入2个数字,我手动添加一个空格。当然,即使空间也显示为•。是否有一种本地方式来改变这种行为?我目前正在使用一个时髦的手动实现。
答案 0 :(得分:8)
如果使用三个不同的文本条目而不是空格,该怎么办?然后,当每个用户输入前三个字符时,您跳转到第二个文本条目?当他再输入两个时,你跳转到第三个文本条目。
以下是一个例子:
编辑:现在支持退格(感谢@ triple-s)。
extension ViewController: UITextFieldDelegate {
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
switch textField {
// Jump forwards
case self.textField1 where string.characters.count == 3 :
self.textField2.becomeFirstResponder()
case self.textField2 where string.characters.count == 2 :
self.textField3.becomeFirstResponder()
// Jump backwards
case self.textField3 where string.characters.count == 0 :
self.textField2.becomeFirstResponder()
case self.textField2 where string.characters.count == 0 :
self.textField1.becomeFirstResponder()
default :
break
}
return true
}
}
答案 1 :(得分:2)
这可以在一个单一的textField中实现。我只在gif中点击了#34; 1"
您选择键盘类型为数字(0-9),这样可以确保输入的所有内容都只有数字。
然后您可以采用textField委托并实现委托方法
func textField(textField:UITextField,shouldChangeCharactersInRange range:NSRange,replacementString string:String) - >布尔{ 打印(字符串)
let char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
let isBackSpace = { return strcmp(char, "\\b") == -92}
if (textField.text?.characters.count == 3 && !isBackSpace()) || (textField.text?.characters.count == 6 && !isBackSpace()){
textField.text = textField.text! + " "
}
if (textField.text?.characters.count) == 11 && !isBackSpace(){
ssnString = textField.text!
self.view.endEditing(true)
}
return true
}
这包括在第三位数字后面添加空格的逻辑,如果你没有退格,那么在第6位数字之后相同。
此外,用户输入11位数后,不允许用户输入更多数字作为SSN的格式,输入11位后,SSN保存在ssnString中,用于特殊屏蔽。
func textFieldDidEndEditing(textField: UITextField) {
if textField.text?.characters.count == 11 {
maskSSNTextField()
}
}
在maskSSNTextField方法中,
func maskSSNTextField() {
textField.text = "••• •• ••••"
}
func textFieldDidBeginEditing(textField: UITextField) {
if textField.text == "••• •• ••••"{
textField.text = ssnString
}
}
这完全符合您的要求。如果您有其他问题,请告诉我。
答案 2 :(得分:2)
我更改了didChangeInRange方法以满足您的新要求,尽管我认为我以前的答案可行。现在它像gif一样工作。如果您希望它仍然被屏蔽,您可以更改textField开始编辑的代码。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
let isBackSpace = { return strcmp(char, "\\b") == -92}
if (textField.text?.characters.count == 3 && !isBackSpace()) || (textField.text?.characters.count == 6 && !isBackSpace()){
textField.text = textField.text! + " "
ssnString = ssnString + " "
}
if isBackSpace() {
ssnString = ssnString.substringToIndex(ssnString.endIndex.predecessor())
}else {
ssnString = ssnString + string
print(ssnString)
if ssnString.characters.count >= 2 {
var starString = ""
for i in 0...ssnString.characters.count-2 {
if i==3 || i==6 {
starString = starString+" "
}else {
starString = starString+"•"
}
}
textField.text = ""
print(ssnString.characters.last)
textField.text = starString
}
}
if (textField.text?.characters.count) == 11 && !isBackSpace(){
self.view.endEditing(true)
}
return true
}
答案 3 :(得分:0)
我一直在使用的简单解决方案是将输入字符串转换为NSAttributedString,并在适当位置添加文本间距(.kern)属性,并将isSecureTextEntry设置为true。 禁用isSecureTextEntry并手动进行操作(除了过于复杂之外),至少在有人使用第三方键盘的情况下,可能会带来安全隐患。
var ssnText = "123456789"
let spacerPositions = [ 2, 4 ]
let spacingAmount: CGFloat = 5.0
let spacerRanges:[NSRange] = spacerPositions
.filter { $0 < ssnText.count - 1 }
.map { NSRange(location: $0, length: 1) }
let attributedString = NSMutableAttributedString(string: ssnText)
for range in spacerRanges {
attributedString.addAttribute(.kern, value: spacingAmount, range: range)
}
textField.attributedText = attributedString
在textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)
中调用这些内容。