Встречается на 27% собеседований по Mobile
Как устроен 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, конкретизирующий обработку действий пользователя и выполнения связанных с ними действий.
- Так же позволяют задать внешний вид компонента при определенном состоянии (выбран, нажат).
text
//допустим, мы создаем кнопку в методе viewDidLoad UIButton* button = [UIButton new]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown]; .... - (void) buttonPressed:(id) sender { }
Oct. 14, 2023, Источник
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы
