How shouldChangeCharactersInRange works in Swift?
Swift 4, Swift 5
This method doesn't use NSString
// MARK: - UITextFieldDelegateextension MyViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if let text = textField.text, let textRange = Range(range, in: text) { let updatedText = text.replacingCharacters(in: textRange, with: string) myvalidator(text: updatedText) } return true }}
Note. Be careful when you use a secured text field.
stringByReplacingCharactersInRange
return a new string, so how about:
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { if let text = textField.text as NSString? { let txtAfterUpdate = text.replacingCharacters(in: range, with: string) self.callMyMethod(txtAfterUpdate) } return true}
Swift 3 & 4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let textFieldText: NSString = (textField.text ?? "") as NSString let txtAfterUpdate = textFieldText.replacingCharacters(in: range, with: string) callMyMethod(txtAfterUpdate) return true}func textFieldShouldClear(_ textField: UITextField) -> Bool { callMyMethod("") return true}
Swift 2.2
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let textFieldText: NSString = textField.text ?? "" let txtAfterUpdate = textFieldText.stringByReplacingCharactersInRange(range, withString: string) callMyMethod(txtAfterUpdate) return true}func textFieldShouldClear(textField: UITextField) -> Bool { callMyMethod("") return true}
Though the textField.text
property is an optional, it cannot be set to nil. Setting it to nil is changed to empty string within UITextField
. In the code above, that is why textFieldText
is set to empty string if textField.text
is nil (via the nil coalescing operator ??
).
Implementing textFieldShouldClear(_:)
handles the case where the text field's clear button is visible and tapped.