UITextField вызывает textFieldDidEndEditing при очистке, но свойство `text` имеет данные

Кто-нибудь заметил, что UITextField вызывает textFieldDidEndEditing после нажатия кнопки очистки, но свойство text все еще имеет старые данные?

Я не уверен, какой пример кода я могу предоставить здесь. Я использую раскадровку, если это имеет значение.

На данный момент мне приходится полагаться на получение данных из всех элементов управления редактирования на кнопке «Отправить» основной формы. Но в идеале я бы предпочел собирать данные в обработчике textFieldDidEndEditing.

Есть ли лучшие обходные пути?

Я на iOS 6.

Обновление: в основном вот то, что у меня есть в форме

  • UITextField и UiButton указаны в форме.
  • Клавиатура отключена вызовом resignFirstResponder в обработчике UITapGestureRecognizer

Действия по воспроизведению проблемы:

  • Щелкните элемент управления редактированием. Введите текст.
  • Коснитесь за пределами текстового элемента управления.
  • textFieldDidEndEditing называется. Свойство .text имеет введенное мной значение. Все хорошо.
  • Нажмите на элемент управления редактированием еще раз.
  • Нажмите на кнопку очистки.
  • textFieldDidEndEditing вызывается снова. Но свойство .text все еще имеет значение, которое я только что удалил!
  • Теперь, когда вы видите, что курсор мигает внутри UITextField, нажмите кнопку в форме.
  • Клавиатура уволена, textFieldDidEndEditing никогда не вызывалась.

Завтра я загружу образец проекта на GitHub.


person expert    schedule 06.09.2013    source источник


Ответы (3)


Я столкнулся с той же проблемой. В моем случае, по крайней мере, это было связано с добавлением UITapGestureRecognizer к self.view (чтобы можно было закрыть клавиатуру при нажатии вне UITextField) и установкой cancelsTouchesInView=NO в распознавателе жестов. Я установил это свойство, чтобы заставить работать гиперссылку на TTTAttributesLabel, который у меня есть в другом месте представления.

Мой обходной путь состоял в том, чтобы следить за отображением клавиатуры и скрывать уведомления и соответствующим образом переключать это свойство:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShowNotification:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHideNotification:) name:UIKeyboardDidHideNotification object:nil];

(подпишитесь на уведомления)

- (void)keyboardDidShowNotification:(NSNotification*)notification
{
    tapGestureRecognizer.cancelsTouchesInView = YES;
}

- (void)keyboardDidHideNotification:(NSNotification *)notification
{
    tapGestureRecognizer.cancelsTouchesInView = NO;
}

(обработка уведомлений)

Единственная проблема с точки зрения поведения заключается в том, что гиперссылка по-прежнему не работает, когда отображается клавиатура: прикосновение к ней просто отключает клавиатуру, а не передает касание обработчику ссылки. Но я могу жить с этим. После сброса клавиатуры ссылка работает нормально.

person T'Pol    schedule 03.12.2014

Сначала проверьте UITextFieldDelegate назначено или нет, затем

внедрите делегат textFieldShouldClear и напишите здесь код, очистите текстовое поле

Для этого вам нужно установить свойство clearButtonMode,

yourTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
yourTextField.delegate = self;

Затем реализуйте делегат textFieldShouldClear

Файл .h

@interface myViewController: UIViewController <UITextFieldDelegate>{
}

Файл .m

-(BOOL)textFieldShouldClear:(UITextField *)textField

    yourTextFeild.text = @"";
    return YES;
}
person Mrunal    schedule 06.09.2013
comment
Спасибо! Я сделал все это. К сожалению, это не имеет значения. Также я должен упомянуть, что textFieldDidEndEditing вызывается перед textFieldShouldClear. - person expert; 06.09.2013

попробуйте здесь:

-(BOOL) textFieldShouldReturn:(UITextField*) textField
person Calin Chitu    schedule 06.09.2013