2010-01-16 5 views
0
NSString *tmpTxt = textField.text; 
BOOL result = [textField becomeFirstResponder]; 
textField.text = tmpTxt; 

Cela fonctionne 80% du temps, mais de temps en temps:UITextField - [textField becomesFirstResponder] - rappelez-vous du texte

  1. L'application se bloque tout.
  2. Le texte sera toujours effacé quoi qu'il arrive.

Quelle est la meilleure façon pour un textField à becomeFirstResponder et conserver encore sa valeur de texte.

Répondre

4

Si elle est effacée quand elle devient FirstResponder, je suppose que vous avez @property (nonatomic) BOOL clearsOnBeginEditing défini sur YES.
Peut-être, où que vous vous souciez de créer textField, ajoutez textField.clearsOnBeginEditing = NO; Si vous utilisez un constructeur d'interface, une case à cocher est présente dans les propriétés du champ de texte.

Quant à savoir pourquoi le plantage la plupart du temps ...

la propriété text est défini comme: @property (nonatomic, copie) NSString * texte

La copie signifie que lorsque vous attribuez une valeur à Il va libérer la valeur précédente, et ensuite faire une copie de la valeur transmise.

Votre première ligne vous gardez un pointeur autour de l'objet NSString sans appeler retenez-le. Ainsi, lorsque vous appelez la méthode getFirstResponder avec clearsOnBeginEditing est appelée, elle définit la nouvelle valeur sur un NSString vide, ce qui libère l'ancienne NSString à laquelle UITextField faisait référence. Puisque c'est la seule chose qui en a la propriété, cet appel de libération appellera dealloc sur NSString, l'invalidant.
Ensuite, vous réaffectez à la propriété text où il tente de copier l'objet qui a été libéré.

Donc, pour le faire de la façon dont vous l'avez, vous devrez appeler conserver et libérer:

NSString *tmpTxt = [textField.text retain]; 
BOOL result = [textField becomeFirstResponder]; 
textField.text = tmpTxt; 
[tmpTxt release]; 

Cependant tout ce que vous devez faire est de définir clearsOnBeginEdit NO et vous ne aurez pas besoin de ce code.