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;
}

1154voto

Daniel G. Wilson Punkte 14829

Von Richtiges Vorgehen beim Rückruf der Textänderung im Uitextfeld :

Ich fange die an ein UITextField-Steuerelement gesendeten Zeichen etwa so ab:

// Add a "textFieldDidChange" notification method to the text field control.

In Objective-C:

[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

In Swift:

textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)

Dann im textFieldDidChange Methode können Sie den Inhalt des textFields untersuchen und Ihre Tabellenansicht bei Bedarf neu laden.

Sie könnten das verwenden und die calculateAndUpdateTextFields als Ihr selector .

417voto

William T. Punkte 12365

Die Antwort von XenElement ist genau richtig.

Sie können dies auch im Interface Builder tun, indem Sie mit der rechten Maustaste auf das UITextField klicken und das Sendeereignis "Editing Changed" auf Ihre Unterklasseneinheit ziehen.

UITextField Change Event

142voto

asdf Punkte 1465

Um den Ereignis-Listener zu setzen:

[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

um tatsächlich zuzuhören:

- (void)textFieldDidChange:(UITextField *)textField {
    NSLog(@"text changed: %@", textField.text);
}

118voto

Juan Boero Punkte 5900

Schnell:

yourTextfield.addTarget(self, action: #selector(yourHandler(textField:)), for: .editingChanged)

Implementieren Sie dann die Rückruffunktion:

@objc final private func yourHandler(textField: UITextField) {
    print("Text changed")
}

34voto

ercolemtar Punkte 405

Wie hier angegeben: UITextField Textänderung Ereignis scheint es, dass ab iOS 6 (iOS 6.0 und 6.1 geprüft) ist es nicht möglich, die Änderungen in UITextField Objekte nur durch Beobachtung der UITextFieldTextDidChangeNotification .

Es scheint, dass nur die Änderungen, die direkt über die eingebaute iOS-Tastatur vorgenommen werden, aufgezeichnet werden. Das bedeutet, dass Sie, wenn Sie Ihre UITextField Objekts, indem Sie einfach etwas wie dieses aufrufen: myUITextField.text = @"any_text" werden Sie über keinerlei Änderungen benachrichtigt.

Ich weiß nicht, ob dies ein Fehler ist oder beabsichtigt ist. Es scheint ein Fehler zu sein, da ich keine vernünftige Erklärung in der Dokumentation gefunden habe. Dies ist auch hier angegeben: UITextField Textänderung Ereignis .

Meine "Lösung" für dieses Problem besteht darin, dass ich für jede Änderung, die ich an meiner Website vornehme, selbst eine Benachrichtigung verschicke. UITextField (wenn diese Änderung ohne Verwendung der eingebauten iOS-Tastatur vorgenommen wird). Etwa so:

myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";

NSNotification *myTextFieldUpdateNotification  = 
  [NSNotification notificationWithName:UITextFieldTextDidChangeNotification
                  object:myUITextField];

[NSNotificationCenter.defaultCenter 
  postNotification:myTextFieldUpdateNotification];

Auf diese Weise können Sie zu 100 % sicher sein, dass Sie die gleiche Benachrichtigung erhalten, wenn Sie die .text Eigentum Ihrer UITextField Objekts, entweder wenn Sie es "manuell" in Ihrem Code oder über die integrierte iOS-Tastatur aktualisieren.

Da dieses Verhalten nicht dokumentiert ist, ist es wichtig zu bedenken, dass dieser Ansatz dazu führen kann, dass Sie 2 Benachrichtigungen für dieselbe Änderung in Ihrem UITextField Objekt. Je nach Ihren Bedürfnissen (was Sie tatsächlich tun, wenn Ihr UITextField.text Änderungen) könnte dies für Sie eine Unannehmlichkeit darstellen.

Ein etwas anderer Ansatz wäre es, eine benutzerdefinierte Benachrichtigung zu posten (d.h. mit einem anderen Namen als UITextFieldTextDidChangeNotification ), wenn Sie tatsächlich wissen müssen, ob die Meldung von Ihnen stammt oder von iOS gemacht" wurde.

EDIT :

Ich habe gerade einen anderen Ansatz gefunden, der meiner Meinung nach besser sein könnte:

Dies beinhaltet die Schlüssel-Werte-Beobachtung (KVO) Funktion von Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA ).

Im Grunde registriert man sich als Beobachter einer Eigenschaft, und wenn sich diese Eigenschaft ändert, wird man darüber informiert. Das "Prinzip" ist ganz ähnlich wie bei der NSNotificationCenter funktioniert, wobei der Hauptvorteil darin besteht, dass dieser Ansatz auch ab iOS 6 automatisch funktioniert (ohne spezielle Anpassungen wie das manuelle Posten von Benachrichtigungen).

Für unsere UITextField -Szenario funktioniert dies problemlos, wenn Sie diesen Code z. B. in Ihre UIViewController die das Textfeld enthält:

static void *myContext = &myContext;

- (void)viewDidLoad {
  [super viewDidLoad];

  //Observing changes to myUITextField.text:
  [myUITextField addObserver:self forKeyPath:@"text"
    options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld 
    context:myContext];

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {

  if(context == myContext) {
    //Here you get notified every time myUITextField's "text" property is updated
    NSLog(@"New value: %@ - Old value: %@",
      [change objectForKey:NSKeyValueChangeNewKey],
      [change objectForKey:NSKeyValueChangeOldKey]);
  }
  else 
    [super observeValueForKeyPath:keyPath ofObject:object 
      change:change context:context];

}

Anerkennung für diese Antwort bezüglich des "Kontext"-Managements: https://stackoverflow.com/a/12097161/2078512

Anmerkung: Es scheint, als ob Sie, während Sie im Verlauf von Bearbeitung einer UITextField Bei der eingebauten iOS-Tastatur wird die Eigenschaft "Text" des Textfelds nicht mit jedem neu eingegebenen/entfernten Buchstaben aktualisiert. Stattdessen wird das Textfeldobjekt "als Ganzes" aktualisiert, nachdem Sie den Erstbeantworter-Status des Textfelds zurückziehen.

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