iPhone - после отставки первого респондента на UITextField, не могу перефокусировать его - PullRequest
1 голос
/ 24 июля 2011

У меня есть модальное окно, которое используется для поиска данных с удаленного сервера - оно имеет UITextField в качестве titleControl панели навигации для окна и табличное представление, заполняющее окно (которое явно отображает результаты). Теперь я хочу, чтобы пользователь прокручивал табличное представление, немедленно терял фокус на текстовом поле (оставлял первого респондента), чтобы клавиатура отклонялась, и у пользователя было больше места для прокрутки табличного представления (оно растягивается, чтобы заполнить оставшийся пробел). по клавиатуре). В основном те же функциональные возможности, что и при использовании UISearchDisplayController (или как там это называется).

Итак, у меня есть этот код для обнаружения события прокрутки таблицы:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [searchField resignFirstResponder];
}

Который работает нормально. Однако проблема заключается в том, что как только пользователь прокручивает таблицу и текстовое поле теряет фокус, вы не можете вернуть ему фокус, снова нажав на него. Так что, как правило, когда я называю это [resignFirstResponser], я больше никогда не могу вернуть клавиатуру обратно и отредактировать значение текстового поля. У кого-нибудь есть идеи, почему? Нужно ли явно вызывать [becomeFirstResponder] на поле где-нибудь? Потому что я думал, что это обрабатывается автоматически при нажатии на поле?

Также обратите внимание: я звоню [becomeFirstResponder] в текстовом поле, когда модальное окно вызывается впервые, поэтому поле предварительно сфокусировано. Может ли это иметь какое-либо отношение к этому?

Я могу опубликовать больше кода, если кто-нибудь захочет, но я не думаю, что я делаю что-то необычное с текстовым полем.

Спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 07 августа 2011

Вы задали делегата для вашего searchField?Я была такая же проблема.Я выскакиваю в виде модели и устанавливаю текстовое поле первым респондентом внутри viewDidLoad.Все работает хорошо в первый раз.Но однажды я увольняю контроллер модального вида и снова открываю его.мое текстовое поле больше не может быть сфокусировано.

Я обнаружил, что оно как-то связано с методами UITextFieldDelegate.Как только я удаляю реализацию для методов

– textFieldShouldEndEditing:
– textFieldDidEndEditing:

, все работает хорошо.но не знаю почему

1 голос
/ 19 августа 2013

Делаете ли вы что-нибудь с textFieldShouldEndEditing, например, @fengd?

Проблема, с которой я столкнулся, заключалась в том, что я просматривал модальное представление, и моя подпрограмма "textFieldShouldEndEditing" неправильно возвращала "НЕТ" в определенном текстовом поле. Когда мой модал был отклонен, я не смог бы нажать на любое другое текстовое поле, предположительно, потому что старое текстовое поле все еще было «первым респондентом». Так как он никогда не может закончить редактирование, он заполняет все остальные текстовые поля, которые идут после него.

Я понимаю, что это через 2 года после свершившегося факта, но, возможно, кто-то еще может найти это полезным.

1 голос
/ 24 июля 2011

Вы вызываете resignFirstResponder из функции, которая будет вызываться каждый раз, когда вы прокручиваете UIScrollview. Следовательно это не появляется. Вам нужно позвонить в отставку, когда uitextview выходит из фокуса.

Вы можете сделать следующее. Это взломать:

  1. Всякий раз, когда вы сосредотачиваетесь на UITextField, создайте невидимую кнопку для наложения вашего вида прокрутки.
  2. Захват события нажатия кнопки и отставка первого респондента
  3. Всякий раз, когда поле uitext становится первым респондентом, создайте кнопку

Таким образом вы устраните ошибку, а именно вызовете метод в scrollViewWillBeginDragging. Другой вариант - переписать метод viewDidAppear для uiTextField.

.

Или вы можете поместить свое текстовое поле в другой контейнер и обработать scrollViewWillBeginDragging, проверив, какой scrollview отправил сообщение.

...