2013-02-28 8 views
38

Ich versuche derzeit, die Zustände eines Textfelds zu verfolgen.UIControlEventEditingChanged wird nicht ausgelöst, wenn setText von UITextfield verwendet

ich eine benutzerdefinierte Datepicker bin mit der der Text über -setText

[self.textField setText:[self.dateFormatter stringFromDate:self.date]]; 

Inside my textFieldDelegate setzt Ich schrieb den folgenden Code:

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    self.travelToOnTextField.delegate = self; 
    [self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
} 

-(void)travelToOnTextFieldDidChange:(id)sender 
{ 
    NSLog(@"Event Handler called"); 
} 

Wenn ich ändern Sie den Text durch meine benutzerdefinierte Datumsauswahl Die Methode travelToOnDateTextFieldDidChange wird nicht aufgerufen. Aber wenn ich den Text mit meiner Computertastatur ändere, wird er aus irgendeinem Grund aufgerufen.

Ist das beabsichtigt?

Antwort

68

Ich musste diese Frage bewerten, weil dies super wichtig ist.

Es scheint, dass dies in iOS6 geändert hat. Vielleicht sogar iOS5. Dieses Ereignis USED als die bevorzugte Methode zum Beobachten von Textänderungen in einem UITextField. Ich benutze es seit iOS3. Nachdem ich meine App auf iOS6 neu kompiliert habe, um einige Updates durchzuführen, hat es auf mysteriöse Weise aufgehört zu arbeiten. Teile meiner app Verwendung:

[UITextField insertText]; 

und andere verwenden

[UITextField setText]; 

oder

UITextField.text = @"xxx"; 

Aus irgendeinem Grund ist es wichtig, dass setText Ereignisse nicht mehr beachten, feuern die Bearbeitung Geändertes Ereignis Wenn Sie eine insertText-Methode verwenden, funktioniert sie immer noch.

textField.text; 

oder

[textField setText:@"xxx"]; 

zu

textField.text = @""; 
[textField insertText:@"new text"]; 
:

Also, wenn Sie in einer Bindung sind und Sie brauchen nur eine schnelle Lösung, können Sie Ihren Code aus ändern out

Dies funktioniert auch:

[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged]; 

Ich hoffe, dass dies jemandem hilft, weil ich einen ganzen Tag damit verschwendet habe herauszufinden, warum dieser Code plötzlich nicht mehr funktioniert, als ich auf iOS6 aufstieg.

Sie können das NSNotificationCenter auch weiterhin verwenden.Siehe die UITextField Referenz für weitere Informationen:

https://developer.apple.com/documentation/uikit/uitextfield

+1

Vielen Dank für Ihre Lösung, Ich habe auch die Methode sendActionsForControlEvents verwendet. –

+1

insertText funktioniert nicht. Aber '[textField sendActionsForControlEvents: UIControlEventEditingChanged]' funktioniert. – Gon

+0

'insertText (_ :)' sollte nur funktionieren, wenn das Textfeld zuerst antwortet, weil die Dokumentation von 'UIKeyInput' besagt, dass Text an der Cursorposition eingefügt wird. – Raginmari

4

Die Dokumentation sagt:

UIControlEventEditingChanged 
A touch making an editing change in a UITextField objet. 
Available in iOS 2.0 and later. 
Declared in UIControl.h. 

So Touch nur?

9

Nur sendActionsForControlEvents: rufen, nachdem Sie den Text ein:

self.textField.text = xxx; 
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged]; 

auf iOS getestet 9.

+0

Danke dafür! –

4

In Swift 2.2+, basierend auf @ Shaolos Antwort

  1. Verbinden Sie IBAction, achten Sie darauf, die Standardvorgabe zu ändern nt Typ EditingChanged

enter image description here

  1. Nachdem Sie Textfield Text von Code ändern, hinzufügen sendActionsLine auch

    taskTextField.text = nil 
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged) 
    
Verwandte Themen