How shouldChangeCharactersInRange works in Swift? How shouldChangeCharactersInRange works in Swift? ios ios

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.