Понимание логики системы для первого респондента - PullRequest
8 голосов
/ 07 сентября 2011

Я запутался в нескольких точках первого респондента:

  1. Если я позвоню - becomeFirstResponder, будет ли системный вызов – canBecomeFirstResponder первым? Почему?
  2. Почему существуют и - becomeFirstResponder, и – canBecomeFirstResponder? В каких ситуациях они могут возвращать разные значения?
  3. Должно ли приложение иметь первого респондента каждый раз? Если так, что происходит, когда я звоню – resignFirstResponder на некоторый объект? UIApplication становится первым респондентом немедленно или этот "токен" брошен в какой-то момент в цепочке респондента? Могу ли я вызвать - becomeFirstResponder на UIApplication объекте, когда я хочу избавиться от этого жетона паломника?
  4. ...

Пожалуйста, кто-нибудь объяснит мне, как система управляет своим первым респондентом. Что происходит под капотом, когда какой-то объект становится первым респондентом, что происходит, когда уходит в отставку первый респондент. Какие звонки делает система ... Спасибо!

1 Ответ

6 голосов
/ 07 сентября 2011
  1. Реализация по умолчанию becomeFirstResponder вызывает canBecomeFirstResponder. Это связано с тем, что респондент, который возвращает NO из canBecomeFirstResponder, не должен быть первым респондентом.
  2. becomeFirstResponder сделает получателя фактически первым ответчиком, если это удастся. canBecomeFirstResponder просто проверяет, готов ли получатель быть первым респондентом, фактически ничего не меняя. Возможно, что becomeFirstResponder может потерпеть неудачу, если текущий первый ответчик отказывается уйти в отставку. Могут быть и другие ситуации, в которых becomeFirstResponder также может потерпеть неудачу.
  3. В вашем коде не должно быть ничего, что имеет статус первого респондента. Судя по частному методу UIResponder firstResponder, в этом случае система не назначает какой-либо конкретной настройки по умолчанию.

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

Когда приходит событие без прикосновения, оно сначала доставляется в окно UIWindow. Окно UIWindow доставляет его первому респонденту. Кажется, в документации не указано, пытается ли UIWindow обработать само событие (и передает ли оно UIApplication как обычно, если оно само не обрабатывает), или просто игнорирует событие, если нет первого ответчика.

Подробнее см. в документации .

...