Absturz in resignFirstResponder in uitableview

8

In meinem UITableView habe ich eine Reihe von benutzerdefinierten Zellen, die ein UITextField enthalten. Ich fand heraus (auf die harte Tour), dass scheinbar die aktuelle Ansicht verlassen wird (entweder durch Drücken eines neuen View-Controllers oder durch Verwerfen der aktiven Ansicht ("Zurück")), wenn die Tastatur noch sichtbar ist. p>

Um die Tastatur auszublenden, wenn der Benutzer noch ein UITextField bearbeitet, aber die Ansicht geändert wird, habe ich [self.view endEditing:YES]; hinzugefügt, kurz bevor ich den neuen Ansichts-Controller gedrückt habe, und auch in der Methode viewWillDisappear .

Jetzt stürzt meine App nur bei einer von fünf Versuchen ab, um die Tastatur zu verbergen. Hier habe ich wahrscheinlich über den Grund erfahren Dies: Wenn die Zelle außerhalb des Bildschirms verschoben wird, wird sie zerstört / recycelt, sodass sie bei Bedarf wieder entfernt werden kann. Das bedeutet, sobald meine Zelle und die darin enthaltenen Textfelder sich vom Bildschirm entfernen und die Nachricht resignFirstResponder an sie senden (entweder manuell oder durch [self.view endEditing:YES]; , stürzt die App ab. Dies ist das Backtrace:

%Vor%

Meine Frage ist nun, wie kann ich die Tastatur des UITextField in meinem UITableViewCell in allen Situationen richtig verstecken? (Die Tabellenansicht verschwindet, der neue Ansichts-Controller wird gedrückt, die Zelle / das Textfeld wurde vom Bildschirm entfernt usw.).

Jede Hilfe wird sehr geschätzt, ich kann die Abstürze einfach nicht loswerden!

Ich habe etwas mehr Code:

1) Benutzerdefinierte Zellklasse:

%Vor%

Implementierung der benutzerdefinierten Zelle:

%Vor%

Zeigt den Controller an, der 4 dieser Zellen enthält:

%Vor%

Der Absturz kann reproduziert werden, indem man auf eine der Zellen mit UITextField klickt, die Zelle aus dem Bildschirm verschiebt (ohne die Tastatur auszublenden), dann die Tabellenansicht einfach verwerfen (z. B. über den Navigationscontroller zurückgehen).

Könnte dies dadurch verursacht werden, dass die Tastatur manuell geöffnet wird, wenn auf die Zelle geklickt wird? ( startEditing method) Ich tue das so, dass der Benutzer nicht auf das Textfeld tippen muss, aber die Bearbeitung beginnt auch, wenn er z.B. Tappt das Zellen-Textlabel.

    
user826955 03.07.2011, 14:44
quelle

5 Antworten

5

Vielleicht ein bisschen spät, aber ich hatte ein ähnliches Problem. Ich konnte sehen, dass Zombies aktiviert waren, und mein UITextView versuchte nach der Aufhebung der Freigabe (mit textViewDidEndEditing) eine Nachricht zu versenden, indem ich aus der Ansicht blätterte. In der Dealloc von meiner Entsprechung Ihrer TextInputCell, setze ich den UITextField-Delegaten einfach auf Null. hat ein Vergnügen gemacht.

    
Doominator 28.02.2012 15:31
quelle
2

Ich hatte heute ein ähnliches Problem mit regelmäßigen Abstürzen, die durch Drücken der UINavigation Zurück-Taste verursacht wurden, während die Tastatur sichtbar war. Mein UITextField war in einer UIScrollView enthalten, um das Scrollen zu ermöglichen, wenn die Tastatur sichtbar war.

Ich kompiliere meine App unter iOS 5.1 mit ARC, und die Lösung für mich bestand darin, meinen UIScrollView-Delegaten im Dealloc-Aufruf auf Null zu setzen.

    
Suman Roy 27.04.2012 07:26
quelle
0

Senden Sie resitFirstResponder einfach an UITextField, das gerade bearbeitet wird, bevor Sie die aktuelle Ansicht verwerfen (aber ich denke, das sollte kein Problem sein). Wenn Sie keinen Zugriff darauf haben, denken Sie daran, welches Textfeld in der Variablen bearbeitet wird:

%Vor%

PS. Können Sie posten, welcher Fehler Xcode anzeigt?

    
alhcr 03.07.2011 15:08
quelle
0

Wie gesagt, ich vermute, dass Ihr Problem nicht direkt mit dem resignFirstResponder-Anruf zusammenhängt, sondern etwas anderes. Höchstwahrscheinlich "besitzt" niemand wirklich die betreffende Ansicht (weil vielleicht zu viele Freigaben oder das Versäumnis, sie zu behalten), und wenn das Rücktrittsanruf gemacht wird, existiert das Objekt nicht.

>

Sie können versuchen, die Anzahl der Retouren verschiedener Objekte in Ihrer App zu drucken (insbesondere die Textansicht) und zu überprüfen, ob die Werte Ihren Erwartungen entsprechen.

    
Hot Licks 03.07.2011 18:13
quelle
0

Ich sehe das in meiner App gegen iOS 5.0 gebaut. Zwei Gedanken kommen mir in den Sinn:

  1. Verhindern Sie Scrollen, wenn die Tastatur angezeigt wird, damit sichergestellt ist, dass das Textfeld nicht wiederverwendet wird.

  2. Ändern Sie den Code um resignFirstResponder , um sicherzustellen, dass der Aufruf immer noch gültig ist. Beispiel: (Hinweis: Ich füge dies in meinen Code ein, aber es wurde noch nicht überprüft, ob der Fehler behoben wurde. Ich werde ein Update veröffentlichen, sobald ich es testen kann)

    %Vor%
software evolved 23.12.2011 19:41
quelle