Встречается на 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
интервью вопросы и ответы