Ich verwende shouldChangeCharactersInRange , um die On-the-Fly- Typensuche zu verwenden .
Ich habe jedoch ein Problem, sollte ChangeCharactersInRange aufgerufen werden, bevor das Textfeld tatsächlich aktualisiert wird:
In Ziel C habe ich dies mit den folgenden Schritten gelöst:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
return YES;
}
Ich habe jedoch versucht, dies in Swift zu schreiben:
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
}
Die Methode wird immer noch aufgerufen, bevor ich einen Wert erhalte?
stringByReplacingCharactersInRange
Geben Sie eine neue Zeichenfolge zurück. Wie wäre es also mit: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 }
quelle
NSString
?Schnelle 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 }
Obwohl die
textField.text
Eigenschaft optional ist, kann sie nicht auf Null gesetzt werden. Das Setzen auf Null wird in eine leere Zeichenfolge geändertUITextField
. Im obigen Code wird dahertextFieldText
die Zeichenfolge auf leer gesetzt, wenn sietextField.text
null ist (über den Null-Koaleszenzoperator??
).Die Implementierung
textFieldShouldClear(_:)
behandelt den Fall, in dem die Schaltfläche zum Löschen des Textfelds sichtbar ist und auf sie getippt wird.quelle
In Swift 3 würde es so aussehen:
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 }
quelle
Swift 3
Wenn Sie die vom Benutzer eingegebenen oder eingefügten Zeichen vorverarbeiten möchten, funktioniert die folgende Lösung wie ein Zauber
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 }
Finden Sie es hier: https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
quelle
shouldChangeCharactersIn
Methode aufgerufen, bevor der textField-Inhalt geändert wirdtrue
in dieser Funktion zurückkehren. Grundsätzlich können Sie mit dem aktuellen und dem neuen Textfeldinhalt tun, was Sie möchten. Außerdem können Sie steuern, ob Sie die Änderung ablehnen möchten. Außerdem können Sie die festgelegte Zeichenfolge ändern. Sie haben hier also die volle Kontrolle.Diese Funktion wird aufgerufen, wenn Änderungen vorgenommen werden, die Benutzeroberfläche jedoch nicht aktualisiert wird und auf Ihre Auswahl wartet
Sehen Sie sich den zurückgegebenen Bool-Wert an
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
true
, bedeutet dies, dass iOS Änderungen akzeptiert (Text, Caret ...).false
, bedeutet dies, dass Sie für all diese Dinge verantwortlich sindquelle
Um den genauen Text in meiner UITextField-Komponente in Swift 3.0 zu erhalten, habe ich Folgendes verwendet:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let enteredTxt = textField.text! + string doSomethingWithTxt(enteredTxt) //some custom method }
quelle