通过插入可见空格来格式化安全文本条目

时间:2016-07-15 17:16:26

标签: ios user-interface cocoa-touch user-input

我希望用户以•••••••••的格式输入社会安全号码。 用户键入前3个数字,然后手动附加空格。然后他们再输入2个数字,我手动添加一个空格。当然,即使空间也显示为•。是否有一种本地方式来改变这种行为?我目前正在使用一个时髦的手动实现。

4 个答案:

答案 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"

enter image description here

  1. 您选择键盘类型为数字(0-9),这样可以确保输入的所有内容都只有数字。

  2. 然后您可以采用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
    

    }

  3. 这包括在第三位数字后面添加空格的逻辑,如果你没有退格,那么在第6位数字之后相同。

    此外,用户输入11位数后,不允许用户输入更多数字作为SSN的格式,输入11位后,SSN保存在ssnString中,用于特殊屏蔽。

    1. 因为您不想屏蔽空间,我们无法使用secureTextEntry。所以在didEndEditing中,只有当用户输入完整的SSN时才给出条件,我们将屏蔽它,如果需要,可以将其修改为任何场景。但我认为这更有意义。
    2. func textFieldDidEndEditing(textField: UITextField) { if textField.text?.characters.count == 11 { maskSSNTextField() } }

      在maskSSNTextField方法中, func maskSSNTextField() { textField.text = "••• •• ••••" }

      1. 最后,我们需要在用户返回时取消屏蔽它,如果他们想要更改文本
      2. func textFieldDidBeginEditing(textField: UITextField) { if textField.text == "••• •• ••••"{ textField.text = ssnString } }

        这完全符合您的要求。如果您有其他问题,请告诉我。

答案 2 :(得分:2)

我更改了didChangeInRange方法以满足您的新要求,尽管我认为我以前的答案可行。现在它像gif一样工作。如果您希望它仍然被屏蔽,您可以更改textField开始编辑的代码。

enter image description here

   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)中调用这些内容。