【问题标题】:How to partially mask a UITextField text in swift?如何在 swift 中部分屏蔽 UITextField 文本?
【发布时间】:2017-09-16 01:39:35
【问题描述】:

--------------------
| **** **** **** 1234 |
--------------------

如您所知,我试图部分屏蔽用户在UITextField 中键入的卡号的前 12 位数字。我花了很多时间来弄清楚如何将数字分成 4 块。现在我面临的挑战是用安全输入样式掩码屏蔽前 12 位数字。

任何帮助将不胜感激。谢谢。

编辑:
添加到目前为止我尝试过的代码:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else {
        return true
    }
    //@"●"
    let lastText = (text as NSString).replacingCharacters(in: range, with: string) as String
    if txtCardNumber.text?.characters.count >= 12 {
        txtCardNumber.text = "●●●● ●●●● ●●●●" // + String()
        return true
    }
    return true
}

目标:我已经发布了我尝试的内容。 ● 在确定textField 的长度超过12 后,无法通过使用12 次。卡在这里。要回答您的问题,它需要在输入时显示数字,但在输入下一个数字时替换为 ●。继续相同的行为直到长度为 12,然后从那里显示数字直到第 16 位。

【问题讨论】:

  • 整个卡号是一串吗?还是由 4 个数字组成的 4 个不同的字符串?
  • 整个卡号为一串。 @亚历克斯
  • 那么它需要在输入时显示字符并在延迟后隐藏它还是在输入时只显示一个星号?
  • 顺便说一句,您至少应该展示您尝试过的内容以及尝试完成时遇到的问题
  • @LeoDabus 我已经发布了我尝试的内容。 ● 在确定textField 的长度超过12 后,无法通过使用12 次。卡在这里。要回答您的问题,它需要在输入时显示数字,但在输入下一个数字时替换为 ●。继续相同的行为直到长度为 12,然后从那里显示数字直到第 16 位。

标签: ios swift uitextfield


【解决方案1】:

更新:我很抱歉,但正如 rmaddy 指出的那样,这个答案的第一个版本没有像我预期的那样工作。所以这是我更新的答案,现在它可以按预期工作了。

假设你有一个完全没有空格的字符串,例如:

let yourString = "1234123412341234"

由 4*4 = 16 位组成。

并且您希望像通常在要求用户输入信用卡号的网站上看到的那样格式化它,然后您可以执行类似的操作来处理空格符号:

let yourString = "1234123412341234"
var resultString = String()

// Loop through all the characters of your string

yourString.characters.enumerated().forEach { (index, character) in

    // Add space every 4 characters

    if index % 4 == 0 && index > 0 {
        resultString += " "
    }

    if index < 12 {

        // Replace the first 12 characters by *

        resultString += "*"

    } else {

        // Add the last 4 characters to your final string

        resultString.append(character)
    }

}

print(resultString)

你会得到**** **** **** 1234

如果您有任何问题,请告诉我!

【讨论】:

  • 我很想知道为什么有人反对这个答案。
  • 尝试在操场上运行您的代码。甚至一旦你得到了要编译的代码,它并没有真正做到所要求的。而且您对string.index(of:) 的使用很奇怪,因为该字符串可以包含某些字符的重复项。
  • 所以,这正是为什么我花时间说我现在没有电脑,目前无法检查它,但它“应该”工作。如果我在代码中犯了任何错误,那么我很高兴您能注意到它,并且我认为您可以编辑我的答案而不是否决它,因为我的意思是,它并不是真正具有约束力的,这对任何方式都没有帮助。 :)
  • 发布无法编译且无法执行所需功能的答案并不是真正具有建设性的。不要匆忙发布代码并期望其他人为您修复您的答案。请花时间发布一个好的答案。否决票不是个人的。这只是表明答案没有帮助的一种方式。让您的答案处于更好的状态,并且可以调整投票。
  • 感谢您的澄清。我没有匆忙发布代码,但正如我所说,我没有可以访问的笔记本电脑,所以我无法检查代码是否可以编译。我发布此答案的原因当然是因为我希望它能够编译(但显然我错了,对此我感到抱歉)并认为它会对 OP 有所帮助。无论如何,感谢您指出这一点,当然是的,一旦我有笔记本电脑检查发生了什么,我就会更新我的答案。以后我会更加小心的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多