Как остановить 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];