【问题标题】:Partial text hiding in Swift TextField部分文本隐藏在 Swift TextField 中
【发布时间】:2020-10-04 14:30:13
【问题描述】:

我使用像 (555) 555-5555 这样的掩码,但我也希望它看起来像 (555) 5 ** - ****。输入文本时我该怎么做才能像这样屏蔽用户?

掩码功能:

func applyPatternOnNumbers(pattern: String, replacmentCharacter: Character) -> String {
    var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
    for index in 0 ..< pattern.count {
        guard index < pureNumber.count else { return pureNumber }
        let stringIndex = String.Index(encodedOffset: index)
        let patternCharacter = pattern[stringIndex]
        guard patternCharacter != replacmentCharacter else { continue }
        pureNumber.insert(patternCharacter, at: stringIndex)
    }
    return pureNumber
}

用法:

sender.text = textString.applyPatternOnNumbers(pattern: "(###) ###-####", replacmentCharacter: "#")

【问题讨论】:

    标签: ios swift string textfield mask


    【解决方案1】:

    您可以在String 上创建一个扩展来屏蔽除国家/地区代码以外的所有数字(圆括号之间的任何数字)。请注意,此功能肯定会有一些性能改进,但我希望它至少可以帮助您入门:

    extension String {
    
        func masked(replacementCharacter: Character = "*") -> String {
            let regex = "\\(.*?\\)"
            let ranges = self.ranges(pattern: regex)
            func isContained(_ index: Int) -> Bool {
                for range in ranges {
                    if index > range.location && index < range.location + range.length - 1 {
                        return true
                    }
                }
                return false
            }
            var maskedString = String()
            for (index, character) in self.enumerated() {
                if isContained(index) {
                    maskedString.append(character)
                } else {
                    if String(character).isDigit {
                        maskedString.append(replacementCharacter)
                    } else {
                        maskedString.append(character)
                    }
                }
            }
            return maskedString
        }
    }
    

    这些是我在上面的代码中使用的一些扩展:

    extension String {
    
        var isDigit: Bool {
            CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: self))
        }
    
        func ranges(pattern: String) -> [NSRange] {
            let regex = try! NSRegularExpression(pattern: pattern)
            return regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.count)).map { $0.range }
        }
    
        subscript (bounds: CountableClosedRange<Int>) -> String {
            let start = index(startIndex, offsetBy: bounds.lowerBound)
            let end = index(startIndex, offsetBy: bounds.upperBound)
            return String(self[start...end])
        }
    
        subscript (bounds: CountableRange<Int>) -> String {
            let start = index(startIndex, offsetBy: bounds.lowerBound)
            let end = index(startIndex, offsetBy: bounds.upperBound)
            return String(self[start..<end])
        }
    }
    

    如果您只想屏蔽字符串中的任何数字(甚至括号内的数字),您可以简化为:

    extension String {
    
        func masked(replacementCharacter: Character = "*") -> String {
            var maskedString = String()
            for character in self {
                if String(character).isDigit {
                    maskedString.append(replacementCharacter)
                } else {
                    maskedString.append(character)
                }
            }
            return maskedString
        }
    }
    

    那么你可以像这样简单地使用它:

    let input = "(123) 456-7890"
    let output = input.masked()
    // Prints (123) ***-****
    

    【讨论】:

    • 对不起,我要找的是 TextField,不是字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2022-11-12
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多