Как остановить UIButton (используемый в качестве пользовательской кнопки очистки), отказывающийся от UITextField в качестве первого ответчика?

Мне нужно создать пользовательскую кнопку очистки для UITextField (из-за моей цветовой схемы). Я использую следующий код (где класс является потомком UITextField):

UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[clearButton setImage:[UIImage imageNamed:@"ClearButton.png"] forState:UIControlStateNormal];
[self setRightView:clearButton];
[self setRightViewMode:UITextFieldViewModeNever];
[clearButton addTarget:self action:@selector(clear:) forControlEvents:UIControlEventTouchUpInside];

Это работает хорошо, в основном. Проблема в том, что нажатие на кнопку очистки приводит к тому, что UITextField сбрасывает статус первого респондента (то есть клавиатура исчезает). Я бы хотел, чтобы UITextField сохранил фокус.

Я попытался просто восстановить статус первого респондента в действии кнопки очистки, но, если UITextField находится в UITableView - и прокручивается - это вызывает некоторую нежелательную прокрутку в таблице, когда клавиатура закрывается и открывается.

Я мог бы использовать UIImageView вместо UIButton, но тогда я не получаю визуальный "пульс" при нажатии кнопки.

Итак, есть ли способ, чтобы UITextField сохранял статус первого респондента при нажатии кнопки?

Я разрабатываю приложение для iPhone с использованием iOS 6.

[NB: цель действия "clear:" просто очищает текстовое поле, но, в любом случае, моя проблема возникает, даже если я не ставлю цель.]

2 ответа

Решение

Нашел причину. У меня есть распознаватель жестов, который используется для обработки закрытия клавиатуры, когда пользователь нажимает "фон". Это было активировано, когда пользователь нажимал кнопку закрытия в текстовом поле.

В итоге я реализовал:

gestureRecognizer:shouldReceiveTouch:

отфильтровать кнопку очистки.

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

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:yourIndex inSection:0];
[self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

и тогда:

[self.textField becomeFirstResponder];
Другие вопросы по тегам