Каково формальное определение службы быстрого реагирования в iOS?

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

Но более формально, какова область действия первого ответчика? Например, это ответчик всего приложения? Кажется, что быть первым ответчиком просто сказать, что этот конкретный объект получит уведомление о взаимодействии. Может ли другой ответчик украсть статус первого ответившего?

Пожалуйста, объясните или направьте меня к соответствующей информации. Я прочитал общее объяснение Apple о том, что такое ответчик. Я ищу объяснение, которое немного больше построено.


person Joey Carson    schedule 15.12.2014    source источник


Ответы (3)


Область действия первого ответчика в iOS определяется иерархией представлений. Помните, что ответчик является частью иерархии ответчиков и определяется документацией Apple:

Ответчик — это объект, который может реагировать на события и обрабатывать их. Все объекты ответчика являются экземплярами классов, которые в конечном итоге наследуются от UIResponder (iOS) или NSResponder (OS X).

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

На этом изображении слева показана иерархия службы быстрого реагирования iOS (справа — OS X):

Иерархия первого респондента

Чтобы ответить на вторую часть вопроса, да, объекты могут «украсть» статус первого респондента, если пользователь взаимодействует с элементом, например:

  1. Пользователь нажимает на textField1. Теперь он первый ответчик.
  2. Пользователь нажимает на textField2. Он принял статус первого респондента от textField1.

...и вы можете присвоить им статус первого ответчика с определенными функциями:

[textField3 becomeFirstResponder]; //This is now the first responder
[textField4 becomeFirstResponder]; //Now textField4 has 'stolen' first responder status
[textField4 resignFirstResponder]; //The text field has resigned its first responder status to the next level up

Для всех, кто читает это, но не ознакомился с документацией Apple по этому вопросу, хорошей отправной точкой является объяснение иерархии ответчиков, которое можно найти здесь: https://developer.apple.com/library/ios/documentation/General./Conceptual/Devpedia-CocoaApp/Responder.html

Надеюсь, это поможет!

person Ryan Kreager    schedule 15.12.2014
comment
Спасибо за Ваш ответ. Для дальнейшего уточнения, когда элемент отказывается от статуса первого ответившего, означает ли это, что последний элемент, который раньше стал первым ответившим, снова становится первым ответившим? - person Joey Carson; 15.12.2014
comment
Это не. Когда вы звоните resignFirstResponder, это просто означает, что в данный момент назначенного респондента нет. У вас нет постоянного респондента. - person Ryan Kreager; 16.12.2014
comment
@RuChernChong onFocus имеет смысл для разработчиков Android, которые только начинают работать с iOS (т.е. для меня) - person Hassan Tareq; 02.12.2019

Это свойство окна. Окно всегда имеет не более одного первого ответчика. Любой UIResponder может претендовать на статус первого респондента, отправив ему becomeFirstResponder, и именно поэтому вы можете заставить UITextField получить «фокус», отправив ему это сообщение.

person matt    schedule 15.12.2014
comment
Это именно тот ответ, который я ищу. Так что, если, например, другой компонент станет первым ответчиком, он украдет фокус для себя? - person Joey Carson; 15.12.2014
comment
Правильно, если ему удастся стать первым ответчиком. (Он может попытаться стать первым ответчиком и потерпеть неудачу.) Может быть только один. - person matt; 15.12.2014
comment
Возможно, вам будет полезно прочитать этот раздел моей книги: apeth.com/iOSBook/ch11. html#_the_responder_chain - person matt; 15.12.2014
comment
Вот почему представление предупреждений может перехватить фокус, не беспокоя текущего первого ответчика. UIAlertView полностью находится в другом UIWindow. - person Sandy Chapman; 15.12.2014

Перед объектом окна имейте в виду один перед процессом, пожалуйста.

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

weak var firstResponder: NSResponder? { get }
person roadRunner    schedule 02.08.2020