当前位置: 首页 > 知识库问答 >
问题:

Swift 5-用X掩码文本字段文本

孟晨朗
2023-03-14

我想实现的是,文本字段的格式应该是XXXX XXXX XXXX当用户点击show按钮时,它应该显示文本1234 5678 9123

请帮帮我

下面是我的代码,在那里我能够实现1234 5678 9123这种格式,屏蔽和存储原始数据是挂起的。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
        if textField.tag == 0 || textField.tag == 1 {
        if string.isBackspace
        {
            if range.location == 5 || range.location == 10
            {
                textField.text?.removeLast()
            }
        }
        
        if string == ""{
            return true
        }

        //range.length will be greater than 0 if user is deleting text - allow it to replace
        if range.length > 0
        {
            return true
        }

        //Don't allow empty strings
        if string == " "
        {
            return false
        }

        //Check for max length including the spacers we added
        if range.location > 13 //23
        {
            return false
        }

        var originalText = textField.text
        let replacementText = string.replacingOccurrences(of: " ", with: "")

        //Verify entered text is a numeric value
        let digits = NSCharacterSet.decimalDigits
        for char in replacementText.unicodeScalars
        {
            if !(digits as NSCharacterSet).longCharacterIsMember(char.value)
            {
                return false
            }
        }
        //Put an empty space after every 4 places
        if (originalText?.count)! > 0
        {
            if (originalText?.count)! < 5 && (originalText?.count)! % 4 == 0{
                originalText?.append(" ")
            }else if(((originalText?.count)! + 1) % 5 == 0){
                originalText?.append(" ")
            }

        }

        textField.text = originalText
        }
        
        //2 - Nick Name,3 - Recipient Name
        if textField.tag == 2 || textField.tag == 3 {
            //Max Limit for Nick Name and Benificiary Name is 65
            if range.location > 64
            {
                return false
            }
        }
        return true
    }

共有1个答案

荀金鹏
2023-03-14

如果我理解正确的话,您的要求是创建一个自定义的安全文本字段。要求是:

  • 用户最多可以输入12个符号
  • 只允许数字
  • 文本字段可能具有“屏蔽”和“普通”模式
  • 显示的文本应通过将4个字符组合在一起来设置格式
  • 每组之间有一个空格
  • 在“屏蔽”模式下,所有数字都被替换为“X”符号
  • 正常模式下数字可见

此外,它会很好,所有的文本字段功能将工作,包括复制粘贴,选择,插入代码在文本中间...

我创建了一个新项目,并很快以以下内容结束:

class ViewController: UIViewController {
    
    @IBOutlet private var textField: UITextField?
    
    private var actualText: String = ""
    private var maskedText: String = ""
    
    private var masked: Bool = true {
        didSet {
            refreshTextField()
        }
    }
    
    @IBAction private func maskedTogglePressed(_ sender: Any) {
        masked = !masked
    }
    
    private func refreshTextField() {
        textField?.text = masked ? maskedText : actualText
    }
}

extension ViewController: UITextFieldDelegate {
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        var newString = (actualText as NSString).replacingCharacters(in: range, with: string) // Apply new text
        
        // Remove all whitespaces
        newString = newString.replacingOccurrences(of: " ", with: "")
        // Remove all that is not a number
        newString = newString.filter("0123456789".contains)
        
        // Split string into components of max 4
        var components: [String] = {
            var toDeplete = newString
            var components: [String] = []
            while !toDeplete.isEmpty {
                let length = min(toDeplete.count, 4)
                components.append(String(toDeplete.prefix(length)))
                toDeplete.removeFirst(length)
            }
            return components
        }()
        // Limit to maximum of 3 components
        if components.count > 3 {
            components = Array(components[0..<3])
        }
        
        // Generate masked components, replacing all characters with X
        let maskedComponents: [String] = components.map { String($0.map { character in return "X" }) }
        
        // Add spaces
        newString = components.joined(separator: " ")
        let maskedText = maskedComponents.joined(separator: " ")
        
        // Assign new strings
        self.actualText = newString
        self.maskedText = maskedText
        
        // Refresh field
        refreshTextField()
        
        // Disallow text field to apply it's change
        return false
    }
    
}

在处理字符串时需要一些改进。但它起作用了。

代码被注释,并且应该提供关于解决方案的更多信息。

 类似资料:
  • 我的网站上有一个表格,我的客户用这个表格给我发信息。有时他们会在信息上写上他们的信用卡号。所以这真的很关键。我想掩盖这些信用卡号。但是当然卡号不会定期出现。 例1:1111222233334444 例2:4444 3333 2222 1111 例3:4444-3333-2222-1111 例4:4444-3333-2222-1111 例5:4444-3333-2222-1111 所以我可以屏蔽例如

  • 下午好! 我试图运行一个宏来打开一个网站,登录,在菜单中选择一个选项,填充一个文本框,然后点击另一个按钮。 到目前为止,我可以打开网站,登录,选择菜单中的选项,但是我无法通过任何方式填充文本框。该输入框有一个文本掩码: 格式:00000-000类型:数字最大字符。: 8分钟字符。: 8 我必须填写的输入如下所示:

  • 本文向大家介绍Swift5中从原始文本创建字符串的方法,包括了Swift5中从原始文本创建字符串的方法的使用技巧和注意事项,需要的朋友参考一下 前言 从原始文本创建Swift字符串通常很痛苦。正确删除原始文本中的任何引号或反斜杠字符是一种令人沮丧的练习。随Xcode 10.2一起发布的Swift 5引入了一种新的语法,使其更容易使用原始文本。 使用字符串文字创建字符串 从文本文本创建字符串时,使用

  • 我在寻找一种方法来放弃我的程序中的一个getter。我有一堆动态创建的文本字段: 下面是getter,我想在这里返回聚焦的TextField 处理程序将接收聚焦字段并调用我的“model”-class中的checkInput()方法。 此刻,它接收到一个由我自己设置的预定义字段。检查答案的代码有效。感谢任何帮助我的人,如果我自己找到了一个方法,我一定会把它贴在这里。

  • 6.6.1 The FieldSet(字段集) 当在Spring Batch中使用纯文本文件时, 不管是将其作为输入还是输出, 最重要的一个类就是 FieldSet。许多架构和类库会抽象出一些方法/类来辅助你从文件读取数据, 但是这些方法通常返回 String 或者 String[]数组, 很多时候这确实是些半成品。 而 FieldSet 是Spring Batch中专门用来将文件绑定到字段的抽象

  • 如果我的问题不是很具体,下面是我想做的。我有一个计算器,它有两个JTextField,一个JLabel(“Answer=”),一个JTextField作为答案。 我有一个JButton数组(0到9),允许用户点击它们,将数字添加到JTextField中,光标在其中处于活动状态。。。这就是问题所在。我只能让两个文本字段中的一个向它们添加数字,或者两者都向彼此添加相同的数字。 例如,如果我点击一个按钮