Что означает ответчик?

88
8

Обычно мы используем resignFirstResponder, чтобы скрыть клавиатуру в приложениях iphone.
Например, когда мы используем UISearchBar, после нажатия пользователем кнопки поиска мы скрываем клавиатуру, реализуя функцию searchBarSearchButtonClicked следующим образом:


 -(void)searchBarSearchButtonClicked:(UISearchBar*)searchBar{   
NSLog(@"Search Button Click, result should be show here");
[searchBar setShowsCancelButton:NO animated:YES];
[searchBar resignFirstResponder];
self.dictTableView.allowsSelection = YES;
self.dictTableView.scrollEnabled = YES;
}

Мы устанавливаем searchBar как первый ответчик, затем клавиатура будет скрыта после нажатия пользователем кнопки поиска.


Почему он работает так? Мы не вызывали какую-либо функцию, скрывающую клавиатуру, мы просто устанавливаем searchBar как первый ответчик, почему система просто скрывает клавиатуру автоматически?


Может ли кто-нибудь объяснить механизм этого процесса?


Большое спасибо!

спросил(а) 2021-01-25T17:46:45+03:00 4 месяца, 4 недели назад
1
Решение
100

Objective-C работает, отправляя сообщения объектам в виде селекторов, которые являются именами методов, принадлежащих к целевому объекту. "Ответчик" - это объект, который будет отвечать на сообщение, отправленное с помощью события пользовательского интерфейса.


Ответчики живут в иерархии, называемой цепочкой ответчиков. Если ответчик не может понять сообщение UI, он передает его следующему ответчику в цепочке вплоть до самого объекта приложения.


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

Это красота высокоинтерфейсного API. Вам не нужно стандартизировать поведение в микроуровне. Объекты сами справляются с этим для вас. Если вы привыкли работать с более процедурным API, это может быть немного дезориентирующим.


(В стороне, это старая шляпа в эти дни, но в начале 90-х годов она была фан-фриккой-тастикой, когда Objective-C и NextStep были основополагающими технологиями. Тим Горерс-Ли изобрел веб-браузер, чтобы он есть предлог для покупки следующего куба.)

ответил(а) 2021-01-25T17:46:45+03:00 4 месяца, 4 недели назад
46

"Первый ответчик" - это объект пользовательского интерфейса, который в настоящее время принимает события (события клавиатуры или касания). Объекты, которые ожидают ввод клавиатуры (например, панель поиска), вызовут клавиатуру, когда она станет первым ответчиком.

Когда вы скажете поисковой панели перестать быть "первым ответчиком" ([searchBar resignFirstResponder]), клавиатура больше не нужна и уходит.

ответил(а) 2021-01-25T17:46:45+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема