642 Stimmen

UITextField Textänderung Ereignis

Wie kann ich Textänderungen in einem textField erkennen? Die Delegatenmethode shouldChangeCharactersInRange funktioniert für irgendetwas, aber es hat meinen Bedarf nicht genau erfüllt. Denn solange es nicht YES zurückgibt, sind die textField-Texte für andere Beobachtermethoden nicht verfügbar.

z.B. in meinem Code calculateAndUpdateTextFields nicht den aktualisierten Text erhalten hat, hat der Benutzer getippt.

Gibt es eine Möglichkeit, etwas zu bekommen wie textChanged Java-Ereignishandler.

- (BOOL)textField:(UITextField *)textField 
            shouldChangeCharactersInRange:(NSRange)range 
            replacementString:(NSString *)string 
{
    if (textField.tag == kTextFieldTagSubtotal 
        || textField.tag == kTextFieldTagSubtotalDecimal
        || textField.tag == kTextFieldTagShipping
        || textField.tag == kTextFieldTagShippingDecimal) 
    {
        [self calculateAndUpdateTextFields];

    }

    return YES;
}

8voto

kidcoder Punkte 2460

Mauersegler 4

func addNotificationObservers() {

    NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeAction(_:)), name: .UITextFieldTextDidChange, object: nil)

}

@objc func textFieldDidChangeAction(_ notification: NSNotification) {

    let textField = notification.object as! UITextField
    print(textField.text!)

}

5voto

pedrouan Punkte 12316

Für Swift 3.0:

let textField = UITextField()

textField.addTarget(
    nil,
    action: #selector(MyClass.textChanged(_:)),
    for: UIControlEvents.editingChanged
)

mit Klasse wie:

class MyClass {
    func textChanged(sender: Any!) {

    }
}

5voto

Fattie Punkte 34702
  1. KVO-Lösungen nicht funktionieren

KVO funktioniert NICHT in iOS für Steuerungen: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html

  1. In der beobachtenden Klasse tun Sie dies:

Sie kennen die Textansicht, die Sie sehen möchten:

var watchedTextView: UITextView!

Tun Sie dies:

NotificationCenter.default.addObserver(
    self,
    selector: #selector(changed),
    name: UITextView.textDidChangeNotification,
    object: watchedTextView)

Aber seien Sie vorsichtig damit:

  • ist es wahrscheinlich, dass Sie nur das aufrufen wollen einmal Rufen Sie also nicht an, zum Beispiel, layoutSubviews

  • Es ist ziemlich schwierig zu wissen, wann man ihn während des Aufbauprozesses am besten anruft. Das hängt von Ihrer Situation ab. Leider gibt es keine standardisierte, feststehende Lösung

  • zum Beispiel können Sie in der Regel sicher pas rufen sie an init Zeit, denn natürlich watchedTextView darf noch nicht existieren

.

  1. das nächste Problem ist, dass ...

Keine der Benachrichtigungen werden aufgerufen, wenn der Text geändert wird programmatisch .

Dies ist ein riesiges, uraltes und dummes Ärgernis in der iOS-Technik.

Kontrolliert einfach nicht tun - Ende der Geschichte - die Benachrichtigungen aufrufen, wenn die Eigenschaft .text programmatisch geändert wird.

Das ist wahnsinnig ärgerlich, denn natürlich setzt jede App, die jemals entwickelt wurde, den Text programmatisch, z. B. indem sie das Feld löscht, nachdem der Benutzer einen Beitrag geschrieben hat, usw.

Sie müssen die Textansicht (oder ein ähnliches Steuerelement) wie folgt untergliedern:

class NonIdioticTextView: UIITextView {

    override var text: String! {
        // boilerplate code needed to make watchers work properly:
        get {
            return super.text
        }
        set {
            super.text = newValue
            NotificationCenter.default.post(
                name: UITextView.textDidChangeNotification,
                object: self)
        }

    }

}

(Tipp - vergessen Sie nicht, dass der Superanruf kommen muss vor ! der Postaufruf).

Dort ist keine Lösung zur Verfügung, es sei denn, Sie beheben das Steuerelement durch Unterklassifizierung, wie gerade oben gezeigt. Das ist die seulement Lösung.

Beachten Sie, dass die Meldung

UITextView.textDidChangeNotification

führt zu

func textViewDidChangeSelection(_ textView: UITextView) 

angerufen werden.

( Nicht textViewDidChange .)

4voto

Riajur Rahman Punkte 1850

Swift 3 Version

yourTextField.addTarget(self, action: #selector(YourControllerName.textChanges(_:)), for: UIControlEvents.editingChanged)

Und geben Sie die Änderungen hier ein

func textChanges(_ textField: UITextField) {
    let text = textField.text! // your desired text here
    // Now do whatever you want.
}

Ich hoffe, es hilft.

3voto

Ucdemir Punkte 2556

Swift 3.1:

Selektor: Klassenname.Methodenname

  cell.lblItem.addTarget(self, action: #selector(NewListScreen.fieldChanged(textfieldChange:)), for: .editingChanged)

  func fieldChanged(textfieldChange: UITextField){

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X