Как устроен responder chain
Иерархия компонентов
- Основой иерархии UI-компонентов iOS приложения является объект UIWindow.
- UIWindow создается при запуске приложения. Далее, все UI-компоненты добавляются как дочерние на UIWindow.
- Обычно, приложение содержит только один объект типа UIWindow.
UIWindow занимается следующим:
- Отображает ваш контент
- Сообщает своим подкомпонентам о событиях взаимодействия пользователя с UI
- Сообщает контроллерам о поворотах устройства
Обработка touch-событий
Для обработки взаимодействия пользователя с UI и внешних событий в iOS используется механизм Responder Chain.
Для touch-событий:
- UIWindow пытается передать touch в объект типа UIView, в котором он был вызван (hit-testing).
- Если UIView не может обработать данный touch (например, объект в данный момент невидим, либо отключил возможность взаимодействия с собой), touch передается в superview данного компонента, и так далее вверх, пока он не будет обработан.
Responder chain
Классы UIApplication, UIViewController и UIView наследуются от класса UIResponder:
- UIResponder определяет порядок, в котором объекты обрабатывают события (touch-события, события от элементов UI (кнопки, слайдеры), изменение текста)
- UIResponder объявляет методы, которые позволяют объектам определять, кто первым будет отвечать и обрабатывать сообщения:
- becomeFirstResponder — объект-получатель сообщения будет первым получать все события, посылаемые системой.
- resignFirstResponder — объект-получатель отказывается от обработки сообщений первым.
UIControl: Target-action
Для обработки стандартных действий пользователя с UI (нажатие кнопки, изменение значения слайдера и т. д.) в UIKit / AppKit используется механизм target-action:
- UI-компоненты, которые могут посылать сообщения, наследуются от UIControl — класс-наследник UIView, конкретизирующий обработку действий пользователя и выполнения связанных с ними действий.
- Так же позволяют задать внешний вид компонента при определенном состоянии (выбран, нажат).
//допустим, мы создаем кнопку в методе viewDidLoad UIButton* button = [UIButton new]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown]; .... - (void) buttonPressed:(id) sender { }
Oct. 14, 2023, Источник
Responder chain (цепочка обработчиков событий) — это концепция, используемая для обработки событий, таких как касания, жесты, нажатия клавиш и другие пользовательские действия. Она представляет собой последовательность объектов (responders), которые могут реагировать на эти события. Цепочка обработчиков позволяет событию быть переданным от одного объекта к другому, пока не будет найден подходящий обработчик события или пока цепочка не будет завершена.
Как это работает
1. Начало цепочки: В контексте iOS приложения, цепочка обработчиков событий начинается с объекта, который первым получает событие. Например, в случае касания экрана это может быть конкретный элемент управления UI (например, кнопка), который распознает касание.
2. Передача события: Если этот объект (responder) не обрабатывает событие, оно передается дальше по цепочке. Обычно следующим в цепочке является родительский элемент в иерархии представлений, и так далее, вплоть до корневого представления.
3. ViewController и дальше: Если событие достигает корневого представления и оно не обрабатывается, оно передается объекту `ViewController` этого представления. Затем `ViewController` может обработать событие или передать его дальше по цепочке.
4. UIApplication и AppDelegate: Если ни один из `ViewControllers` не обработал событие, оно может быть передано объекту приложения (`UIApplication`) и, в конечном счёте, его делегату (`AppDelegate`), где оно может быть обработано или проигнорировано.
Пример:
Представим ситуацию, когда пользователь нажимает на кнопку, но код обработки события нажатия отсутствует в классе этой кнопки. В таком случае событие будет передано родительскому представлению кнопки. Если и родительское представление не обрабатывает это событие, оно продолжит передаваться вверх по иерархии представлений, пока не найдет подходящий обработчик или не достигнет конца цепочки.
Зачем это нужно
Responder chain позволяет создавать гибкую архитектуру обработки событий, где события могут быть обработаны на разных уровнях приложения. Это обеспечивает большую модульность и разделение ответственности между компонентами приложения. Кроме того, это упрощает добавление новых типов обработчиков событий, не нарушая существующую логику приложения.
Responder chain — это система для передачи и обработки событий, которая обеспечивает последовательную передачу событий от одного объекта к другому в пределах иерархии приложения, пока событие не будет обработано или не достигнет конца цепочки. Это ключевой механизм для обработки пользовательского ввода и других событий в приложениях для платформ Apple.
April 10, 2024, easyoffer