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.