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

這個工程的80%的時間,但偶爾:的UITextField - [文本框becomesFirstResponder] - 記住文本

  1. 整個應用程序會崩潰。
  2. 無論發生什麼情況,文本仍將被刪除。

什麼是textField成爲FirstResponder並仍然保留其文本值的最佳方式。

回答

4

如果清除時它變成FirstResponder,我猜是你有@property(nonatomic)BOOL clearsOnBeginEditing設置爲YES。
也許,只要你關心創建textField,添加textField.clearsOnBeginEditing = NO; 如果您正在使用界面構建器,則在該文本框的屬性中有一個複選框。

至於爲什麼它崩潰的大部分時間......

文本屬性定義爲:@property(非原子,副本)的NSString *文本

當你分配一個值的拷貝是指它將釋放先前的值,然後複製傳入的值。

您的第一行是保持NSString對象的指針而不調用retain。所以當你調用與清晰的OfBeginEditing被調用時,它會將新值設置爲一個空的NSString,這將釋放UITextField引用的舊的NSString。由於它唯一擁有它的所有權,該釋放調用將調用NSString上的dealloc,使其無效。
然後您將其重新分配給文本屬性,在該文件屬性中嘗試複製已釋放的對象。

所以做你的方式,你將需要調用保留和釋放:

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

但是所有你需要做的是設置clearsOnBeginEdit爲NO,你將不再需要的代碼。