2009-08-04 16 views
11

Ich spiele mit dem Schreiben meiner ersten iPhone App; SDK 3.0. Ich habe ein UITextField, und wenn Text in das eingegeben wird, möchte ich den DoubleValue aus dem Textfeld abrufen und einige Berechnungen durchführen und sie in einem UITableView anzeigen.Warum wird TextFieldDidEndEditing: nicht aufgerufen?

Der Delegat für das UITextField übernimmt das UITextFieldDelegate-Protokoll und implementiert sowohl textFieldShouldReturn: als auch textFieldDidEndEditing: methods. textFieldSouldReturn: gibt den First Responder Status zurück, der laut docs auch textFieldDidEndEditing auslösen soll, aber ich sehe nie textFieldDidEndEditing: called.

- (BOOL)textFieldShouldReturn:(UITextField*)theTextField { 
    if (theTextField == thresholdValue) { 
     [thresholdValue resignFirstResponder]; 
    } 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [self updateThresholdValue:textField]; 
} 

Es kann sich lohnen, unter Hinweis darauf, dass ich auch versucht, einige der Ereignisse Textfeld an den Delegaten verbindet und das Ereignis Anruf updateThresholdValue mit: direkt, aber das hat nicht funktioniert entweder.

+0

Legen Sie einige NSLogs fest, um sicherzustellen, dass die Methode nie tatsächlich aufgerufen wird. – mk12

+0

Du hast myTextField.delegate = self irgendwo richtig gemacht? – mk12

+2

Ich nehme an, er hat seinen Delegierten korrekt verdrahtet, ansonsten würde textFieldShouldReturn: auch nicht aufgerufen werden. –

Antwort

1

Wie in einem der Kommentare erwähnt, habe ich versucht, eine einfachere Version von dem, was ich versuchte, mit einer HelloWorld App zu replizieren, und es funktionierte beim ersten Versuch, ohne Probleme, wie erwartet. Angesichts dessen begann ich mich etwas zu wundern.

Irgendwo in dem ganzen Googeln, das ich versuchte, um eine Antwort auf dieses Problem zu bekommen, lief ich über einen Link, wo eine Person ein Problem mit Ereignissen hatte, die nicht von einer Schaltfläche ausgelöst wurde, und es stellte sich heraus, dass das Problem verwandt war zu der Ansicht, in der die Schaltfläche platziert wurde, und diese Ansicht, die eine andere Unteransicht als einen Peer zu der Schaltfläche hatte, und diese Unteransicht die Ereignisse irgendwie verschlang, anstatt ihnen zu erlauben, dahin zu gehen, wohin sie geleitet worden waren. Das Szenario war nicht genau dasselbe wie meines, aber es klang nah genug, dass eine Untersuchung sich lohnen würde. Trotz aller ausgezeichneten Ratschläge hatte noch keiner Früchte getragen.

Letzte Nacht habe ich beschlossen, die Nib-Datei von Grund auf neu zu erstellen (eine Kopie von dem, was ich zuerst hatte), und ich habe es zur Arbeit. Der Hauptunterschied scheint zu sein, dass ich in der ursprünglichen nicht funktionierenden Nib-Datei über eine TableViewController aus der Palette gezogen habe, dann änderte ich den Typ in meine Unterklasse PZTableViewController. Als ich das Gleiche in meiner neuen Feder tat, feuern die Ereignisse nicht. Wenn ich andererseits die übergezogene TableViewController entfernte und stattdessen einfach über eine NSObject zog und ihre Klasse in PZTableViewController änderte und alles auflöste, funktionierte alles "einfach".

Ich werde versuchen, den Link zu verfolgen, der mich auf dieser Linie des Denkens begonnen hat und es entweder als eine Bearbeitung oder als ein Kommentar bekannt gibt.

Dies ist auch keine vollständige Antwort, weil ich den Unterschied zwischen der Palette TableViewController und meiner Unterklasse noch nicht verstehe. Wenn ich das herausgefunden habe, werde ich diese Antwort über Bearbeiten oder Kommentar aktualisieren.

5

textFieldDidEndEditing wird ausgelöst, wenn das Textfeld den Status des Erstansprechers ablehnt, während textFieldShouldReturn ausgelöst wird, wenn die Eingabetaste gedrückt wird.

Es klingt wie Ihr Textfeld ist nie als FirstResponder zurücktreten. Sie können es ziemlich leicht überprüfen, indem Sie etwas Debug-Ausgabe (wie in den Kommentaren vorgeschlagen) und nur aus dem Textfeld mit einer Berührung navigieren - z. B. tippen Sie dann tippen Sie einfach außerhalb des Feldes, um es zu zwingen, response FirstResponder.

Nicht sicher, ob das viel hilft, aber es klingt wie ein seltsamer Fall, den Sie schlagen.

+0

Danke für die Notiz. Sehen Sie sich den Code an, den ich der ersten Frage hinzugefügt habe. testFieldShouldReturn: ruft resignFirstResponder auf, und ich habe bestätigt, dass die Resignation-Codezeile über den Debugger ausgeführt wird. Wird textFieldDidEndEditing: als Teil der Ausführung von resignFirstResponder aufgerufen oder tritt sie auf * nachdem * resignFirstResponder die Ausführung abgeschlossen hat? Schließlich, falls es darauf ankommt, renne ich immer noch im Simulator und nicht am eigentlichen Gerät. Ich habe die magischen Schlüssel noch nicht. –

+0

Mehr Infos dazu ... Ich habe HelloWorld Demo-App ausgepeitscht - hat ein Textfeld, einen Button und ein Label: tippe Text in das Feld, drücke den Button, lade Updates. Ich habe die Schreibspitze so geändert, dass die Beschriftung ein "Editing Did End" -Ereignis an das gleiche Objekt und die gleiche Aktion sendet, die die Schaltfläche verwendet. Und es hat funktioniert. Also ging ich zurück zu meiner oben beschriebenen App und machte das gleiche ... und es hat nicht funktioniert. Es muss etwas subtil anders sein, aber bis jetzt habe ich es nicht entdeckt. –

+0

Eine andere Sache, die ich überprüfen würde ist, dass die Methodensignatur für textFieldDidEndEditing * genau * mit der Signatur aus den API-Dokumenten übereinstimmt, sieht für mich richtig aus, aber wenn es einen Fehler gibt, wird die Delegate-Methode niemals aufgerufen. Sie können die Signatur tatsächlich direkt aus den API-Dokumenten kopieren, um sicher zu gehen. – paulthenerd

6

Gerade lief das gleiche Problem, das Sie beschrieben haben.Nach dem Versuch, alles, was ich von Ich denke, könnte diese Delegatmethode hinzugefügt:

// if we encounter a newline character return 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    // enter closes the keyboard 
    if ([string isEqualToString:@"\n"]) 
    { 
     [textField resignFirstResponder]; 
     return NO; 
    } 
    return YES; 
} 

nun die textFieldShouldEndEditing Feuer und das Textfeld tritt zurück Ersthelfer.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

Betrachten Sie nun den Fall, wenn Sie zwei UITextFields auf demselben VC haben. Ist es eine gute Idee, kbd bei der Eingabe zurückzugeben? –

1

landete ich Verkabeln editingChanged bis zu jeder einzelnen Änderung zu einem Textfeld aufnehmen, anstatt herauszufinden, wie mit den restlichen Rückrufen alle Eckfällen abzudecken.

Sehr "effizient" aufgrund der androidähnlichen "Verwendbarkeit" des textFieldDidEndEditing (Sarkasmus).

Verwandte Themen