在我的项目中,我需要在文本字段中添加文本时放入设备MAC地址验证。我的设备mac地址格式是“AB:5E:CF:45:S5:6D”。因此,当我要添加任何字符时,它应该改为在文本字段中的2个字符后添加冒号。
示例:“45DF5R6”=“45:DF:5r:6”“SD45ER65DF6G”=“SD:45:ER:65:DF:6g”
感谢你的帮助。
提前谢谢。
发布于 2018-09-24 21:54:53
尝尝这个
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let text = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let count = text.count
if string != "" {
if count > 17
{
return false
}
if count % 3 == 0{
txtField.text?.insert(":", at: String.Index.init(encodedOffset: count - 1))
}
return true
}
return true
}发布于 2018-09-25 02:05:11
您应该子类UITextField并添加一个用于编辑更改的控件事件的目标,然后您只需要删除无效的十六进制字符,并使用我在此answer中发布的每两个字符在字符串中插入一个字符的方法再次格式化清理后的字符串
class MacAddressField: UITextField {
override func didMoveToSuperview() {
keyboardType = .default
textAlignment = .left
autocorrectionType = .no
autocapitalizationType = .none
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
}
@objc func editingChanged(_ textField: UITextField) {
text = text!
.filter(\.isHexDigit)
.prefix(12)
.pairs
.joined(separator: ":")
.lowercased()
}
}extension Collection {
func subSequences(limitedTo maxLength: Int) -> [SubSequence] {
precondition(maxLength > 0, "groups must be greater than zero")
return .init(sequence(state: startIndex) { start in
guard start < self.endIndex else { return nil }
let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
defer { start = end }
return self[start..<end]
})
}
var pairs: [SubSequence] { subSequences(limitedTo: 2) }
}发布于 2018-09-24 20:14:46
您正在寻找UITextField的委托函数:
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool 您可以在该函数中编写输入特定逻辑。它通常用于屏蔽电话号码,或者限制添加到文本字段中的字符数。你的格式化问题也很适合。
https://stackoverflow.com/questions/52479082
复制相似问题