I set my text field to accept integer only but want to use UITextField inheritance rather than delegate of shouldChangeCharactersInRange
.
Is there any way to get text value before editingChanged
called as using dropLast()
won't work in case the typed-in character is not at the last position.
class TextFieldInteger: UITextField {
// A character set with number digits only
let decimalRange = CharacterSet.decimalDigits
override func awakeFromNib() {
self.addTarget(self, action: #selector(editingDidBegin), for: .editingDidBegin)
self.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
}
func editingDidBegin() {
// Remove all existing "," from the input if having any
input = input.replacingOccurrences(of: ",", with: "")
}
func editingChanged() {
if input.characters.count > 0 {
let textSet = CharacterSet(charactersIn: input)
if !decimalRange.isSuperset(of: textSet) {
input.dropLast()
}
}
}
}
extension UITextField {
var input: String {
get { return text ?? "" }
set { text = newValue }
}
}