eureka community color ios objective-c swift uitextfielddelegate nsrange

ios - community - navigationcontroller title color



¿Cómo debería funcionarChangeCharactersInRange en Swift? (6)

Estoy usando shouldChangeCharactersInRange como una forma de usar la búsqueda de tipo sobre la marcha.

Sin embargo, estoy teniendo un problema, debería llamar aChangeCharactersInRange antes de que el campo de texto se actualice realmente:

En el objetivo C, resolví esto usando a continuación:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string]; return YES; }

Sin embargo, he intentado escribir esto en Swift:

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { let txtAfterUpdate:NSString = self.projectSearchTxtFld.text as NSString txtAfterUpdate.stringByReplacingCharactersInRange(range, withString: string) self.callMyMethod(txtAfterUpdate) return true }

¿Todavía se llama al método antes de obtener un valor?


Swift 3

Si desea preprocesar los caracteres que el usuario escribió o pegó, la siguiente solución funciona de maravilla

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let strippedString = <change replacements string so it fits your requirement - strip, trim, etc> // replace current content with stripped content if let replaceStart = textField.position(from: textField.beginningOfDocument, offset: range.location), let replaceEnd = textField.position(from: replaceStart, offset: range.length), let textRange = textField.textRange(from: replaceStart, to: replaceEnd) { textField.replace(textRange, withText: strippedString) } return false }

Encuéntralo aquí: https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047


Swift 3 y 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 }

Aunque la propiedad textField.text es opcional, no se puede establecer en nil. Establecerlo en nil se cambia a una cadena vacía dentro de UITextField . En el código anterior, es por eso que textFieldText se establece en una cadena vacía si textField.text es nil (a través del operador de textField.text nil ?? ).

La implementación de textFieldShouldClear(_:) maneja el caso donde el botón de borrar del campo de texto es visible y tocado.


En Swift 3 se vería así:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let text: NSString = (textField.text ?? "") as NSString let resultString = text.replacingCharacters(in: range, with: string) return true }


Para obtener el texto exacto en mi componente UITextField en Swift 3.0 utilicé:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let enteredTxt = textField.text! + string doSomethingWithTxt(enteredTxt) //some custom method }


stringByReplacingCharactersInRange devuelve una nueva cadena, entonces, ¿qué tal si:

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 4, Swift 5

Este método no usa NSString

// MARK: - UITextFieldDelegate extension 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 } }

Nota. Tenga cuidado cuando use un campo de texto seguro.