Ich habe eine IBAction
, die ich mit einem UITextField
Element in Interface Builder verbunden habe. (Auslösen bei Ereignis "Wert geändert")
Ich habe auch eine UISlider
, die das TextField-Element automatisch aktualisiert, wenn sein Wert angepasst wird.
Wenn ich meine App starte, wird das TextField aktualisiert, wenn ich den Schieberegler anpasse, aber das Ereignis "Wert geändert" wird in diesem Fall nicht ausgelöst. Das Ereignis "Wert geändert" wird auch nicht ausgelöst, wenn ich das TextField ebenfalls von Hand bearbeite. (Obwohl der Trigger Did Editing End verwendet wird, wird er ausgelöst.)
Meine Frage ist, wie ich den Wertänderungsauslöser sowohl für eine programmatische Aktualisierung des TextFields als auch für den Zeitpunkt, zu dem der Benutzer den Wert anpasst, auslösen kann.
quelle
shouldChangeCharactersInRange
Mit dieser Option können Sie entscheiden, ob Änderungen vorgenommen werden sollen oder nicht, und Sie müssen das Ergebnis selbst berechnen. Wenn die Änderung also immer stattfinden wird und Sie sich nur um den geänderten Wert kümmern, ist die VerwendungUIControlEventEditingChanged
definitiv einfacher.Antworten:
Verwenden
UITextFieldDelegate
und implementieren Sie, wie von TheRonin vorgeschlagen, die folgende Methode- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
quelle
<UITextFieldDelegate>
Sie die Deklaration der .h-Dateischnittstelle hinzu. Legen Sie den Delegaten des Textfelds über die NIB-Datei auf den Dateieigentümer fest. Implementieren Sie die oben genannte Methode im Viewcontroller.UITextFieldTextDidChangeNotification
Ich bin mir jedoch nicht sicher, wie ich es umsetzen soll.fo
und dann tippeno
,textField.text
ist das stillfo
und noch nichtfoo
. Sie müssten die Änderung manuell anwenden, um die Zeichenfolge zu erhalten, auf die das Textfeld gesetzt wird.Nicht verwenden
UIControlEventValueChanged
fürUITextField
. Was du willst istUIControlEventEditingChanged
.quelle
UITextFieldDelegate
macht ganz andere Sache.Um zu erhalten
EditingChanged textfield event
, schlug ich vor, Selektor als hinzuzufügen[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
Wenn sich der Textfeldwert ändert, wird der geänderte Wert von diesem
textChanged:
Selektor angezeigt .-(void)textChanged:(UITextField *)textField { NSLog(@"textfield data %@ ",textField.text); }
quelle
Wenn Sie dem Textfeld einen Delegaten zuweisen, beachten Sie, dass (wenn Sie NO von der folgenden Delegate-Methode zurückgeben, das Ereignis (Änderung geändert) nicht ausgelöst wird. Erwägen Sie, den Ereignis-Listener aufzurufen, wenn Sie NO von dieser Methode zurückgeben
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
quelle
Eine alte Frage, aber das erste Suchergebnis, das ich gefunden habe, und keine der Antworten ist zufriedenstellend. Ich fand, dass diese Lösung am besten funktioniert: Swift UITextField-Unterklassen behandeln Textänderungen programmgesteuert .
Überschreiben Sie die Texteigenschaft von UITextField, um ein didSet () hinzuzufügen, und rufen Sie von dort aus Ihre Funktion zur Wertänderung auf.
quelle
Während der Wert programmgesteuert zugewiesen wird, wird in diesem Fall textFieldDidChange nie aufgerufen, da sich textField tatsächlich nicht geändert hat. Für dieses externe Ereignis muss bestanden werden
Beispiel: textfield.sendActions (für: .editingChanged) Dies löst das bearbeitete geänderte Ereignis aus und textFieldDidChange wird aufgerufen, selbst nachdem der Wert programmgesteuert geändert wurde.
Nach dem Zuweisen eines Wertes zu dem abgelegten Text, z. B. textfield.text = "irgendein Wert"
quelle
Swift 4:
class YourViewController: UIViewController { // MARK: Outlets @IBOutlet weak var titleTextField: UITextField! // MARK: View lifecycle override func viewDidLoad() { super.viewDidLoad() titleTextField.delegate = self } } // MARK: UITextFieldDelegate methods extension YourViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { print("changed") return true } }
quelle
Für Swift 3 :
textField.addTarget(self, action: #selector(textChanged), for: .valueChanged) func textChanged() { .... }
quelle
for: .editingChanged
..valueChanged