Вы можете сделать это таким образом, указав self
в качестве делегата:
let slash = "/"
let digits = CharacterSet(charactersIn: "0123456789")
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//Deleting
if string.count == 0 {
var text = textField.text!
let start = text.startIndex
let beginRange = text.index(start, offsetBy: range.location)
let endRange = text.index(start, offsetBy: range.location + range.length)
text = String(text.prefix(upTo: beginRange))
+ String(text.suffix(from: endRange))
text = text.replacingOccurrences(of: "/", with: "")
if text.count >= 3 {
text = String(text.prefix(2)) + "/" + String(text.dropFirst(2))
}
textField.text = text
return false
}
//Typing
let count = textField.text!.count
guard string.count == 1,
count < 6,
let scalar = Character(string).unicodeScalars.first else {
return false
}
let isDigit = digits.contains(scalar)
switch count {
case 0, 3..<6 :
return isDigit
case 1:
if isDigit {
textField.text = textField.text! + string + "/"
}
return false
case 2:
if string == slash {
return true
} else {
textField.text = textField.text! + "/" + string
return false
}
default:
return false
}
}
Этот код работает и с клавиатурой по умолчанию, а не только с цифровой клавиатурой.