resignFirstReponder на ощупь где-то за пределами UITextView с вложенной иерархией представления - PullRequest
1 голос
/ 29 июля 2011

мой первый вопрос по stackoverflow ... я очень нервничаю;)

Хорошо, у меня проблемы с тем, чтобы сделать UITextView resignFirstResponder в тот момент, когда я касаюсь некоторого места в остальной части моей иерархии представления. Это так:

UIView -> UITableView -> UITableCell -> UIView (мой контейнерный вид) -> UIView (мой пузырьковый обзор) -> UITextView

Поскольку UITextView isFirstResponder, мы можем заполнить некоторый текст, и клавиатура будет показана. Было бы неплохо, если бы нам не приходилось отклонять клавиатуру, нажимая кнопку, а просто нажав снаружи UITextView где-нибудь на поверхности.

Но как и где я должен реагировать на жест касания? И на этом контроллере где-то в цепи. У меня не везде есть ссылка на UITextView, чтобы отправить ему сообщение (resignFirstReponder) на ...

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

Надеюсь, кто-нибудь может дать некоторые подсказки ...

С уважением,

Йерун

Ответы [ 3 ]

2 голосов
/ 29 июля 2011

Вы можете использовать NSNotificationCenter для запуска уведомления, когда вы касаетесь за пределами границ текстовых полей, на которые ваши текстовые поля отвечают, с помощью resignFirstResponder.

Изменить более подробно:

Вы можете реализовать следующий метод на вашем UIViewController / View

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [myTextFeild resignFirstResponder];
    ...or send a notification etc.
}

Это немного дешевый способ сделать это, но он работает.

0 голосов
/ 30 июля 2011

В моем проекте с открытым исходным кодом https://github.com/Jayway/CWUIKit есть класс с именем CWPrimaryViewWindow, который является вспомогательным классом для реализации этого поведения.

Основная идея заключается в создании подкласса UIWindow для того, чтобы перехватить все сенсорные события. Затем заблокируйте все события касания, не предназначенные для основного представления , вместо этого отправьте уведомление об отмене. При передаче событий касания на основной вид в обычном режиме.

0 голосов
/ 29 июля 2011

Вы можете попробовать создать подкласс UITextField и переопределить pointInside. Проверьте полученное касание, и если оно находится за пределами вашего экземпляра подкласса UITextField, то resignFirstResponder.

Edit: Вышесказанное на самом деле не сработает, и я прошу прощения за плохой совет. Вместо этого я бы предложил добавить прозрачное подпредставление поверх окна, которое переопределяет hitTest и вызывает предопределенный обратный вызов, но возвращает nil. В обратном вызове вы можете выполнить какую-то произвольную задачу (например, подать в отставку первого респондента из вашего текстового представления), а затем удалить представление из иерархии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...