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

Это работает 80% времени, но иногда:UITextField - [TextField becomesFirstResponder] - запомнить текст

  1. Весь приложение будет врезаться.
  2. Текст по-прежнему будет удален, что бы ни случилось.

Каков наилучший способ для textField стать FirstResponder и сохранить его текстовое значение.

ответ

4

Если его очистка, когда он становитсяFirstResponder, я думаю, что у вас есть @property (неатомный) BOOL clearsOnBeginEditing установлен в YES.
Возможно, где бы вы ни заботились о создании textField, добавьте textField.clearsOnBeginEditing = NO; Если вы используете построитель интерфейсов, в свойствах для текстового поля есть флажок.

Относительно того, почему его разбивая большую часть времени ...

текст свойство определяется как: @property (неатомической, копия) NSString * текст

Копия означает, что когда вы присваиваете значение он, будет высвобождать предыдущее значение, а затем сделать копию переданного значения.

В первой строке вы держите указатель вокруг объекта NSString без вызова удержания на нем. Поэтому, когда вы вызываете startFirstResponder с именем clearsOnBeginEditing, он устанавливает новое значение в пустую NSString, которая выдает старую NSString, на которую ссылалась ссылка UITextField. Поскольку это единственное, что имело право владения им, этот вызов освобождения вызовет dealloc на NSString, недействительным.
Затем вы переназначаете его обратно в свойство text, где он пытается скопировать освобожденный объект.

Так, чтобы сделать это так, как вы имеете его, вам нужно будет позвонить сохранить и освободить:

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

Однако все, что вам нужно сделать, это установить clearsOnBeginEdit к NO и вам не нужен этот код.

Смежные вопросы