wake-up-neo.net

Wie sollChangeCharactersInRange in Swift funktionieren?

Ich benutze shouldChangeCharactersInRange als eine Möglichkeit, die On-the-Fly-Suche zu verwenden.

Ich habe jedoch ein Problem. shouldChangeCharactersInRange wird aufgerufen, bevor das Textfeld tatsächlich aktualisiert wird:

In Ziel C habe ich dieses Problem gelöst, indem ich Folgendes verwendet habe:

-(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 noch aufgerufen bevor ich einen Wert bekomme?

56
Ryan

Swift 4

Diese Methode verwendet nicht 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
    }
}

Hinweis. Seien Sie vorsichtig, wenn Sie ein geschütztes Textfeld verwenden. 

74
Vyacheslav

stringByReplacingCharactersInRange gibt eine neue Zeichenfolge zurück.

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
}
66
Mike Pollard

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
}

Schnell 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. Die Einstellung auf null wird in UITextField in eine leere Zeichenfolge geändert. Im obigen Code ist textFieldText deshalb auf leere Zeichenfolge gesetzt, wenn textField.text nil ist (über den Nullkoaleszenzoperator ??).

Die Implementierung von textFieldShouldClear(_:) behandelt den Fall, in dem die Schaltfläche "Löschen" des Textfelds sichtbar ist und angetippt wird.

37
Mobile Dan

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
}
10
Andrey Gordeev

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
}

Hier finden Sie es: https://Gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

0
blackjacx