Какие основные классы UIKit наследуются от UIResponder?

Ответ

UIResponder — это фундаментальный класс в UIKit, который формирует цепочку ответчиков (responder chain) и обрабатывает события (касания, встряхивания, нажатия клавиш, удаленные события). От него напрямую или косвенно наследуются почти все классы, участвующие в отображении и управлении интерфейсом.

Ключевые наследники UIResponder:

Класс Назначение Роль в цепочке ответчиков
UIView Базовый класс для всех визуальных элементов (кнопки, лейблы, кастомные view). Является основным ответчиком для событий касания в своей области.
UIViewController Управляет группой view (иерархией), координирует их жизненный цикл и логику. Часто является точкой обработки событий, которые не обработаны view.
UIApplication Центральный управляющий объект приложения. Корень цепочки ответчиков. Получает события, если они не обработаны вью или контроллерами.
UIWindow Основной контейнер для view-иерархии. Окно передает события в свою корневую view, а далее по цепочке.

Пример иерархии наследования:

// Все эти классы в конечном счете являются UIResponder'ами
class CustomView: UIView {} // UIView -> UIResponder
class CustomViewController: UIViewController {} // UIViewController -> UIResponder
let app = UIApplication.shared // UIApplication -> UIResponder
let window = UIWindow() // UIWindow -> UIView -> UIResponder

Почему это важно? Понимание цепочки UIResponder критично для:

  • Обработки событий: Система ищет первый объект в цепочке, способный обработать событие (например, touchesBegan(_:with:)).
  • Работы с UIResponder стандартными действиями: Например, для вызова меню "Copy/Paste" или обработки команд с клавиатуры.
  • Реализации кастомной логики событий, которая должна передаваться вверх или вниз по иерархии.

Ответ 18+ 🔞

Смотри, вот тебе вся эта кухня про UIResponder без прикрас, как есть.

Этот тип — он как дед всех, кто хоть как-то может пальцем пошевелить в интерфейсе. Представь себе огромную семью, где все друг другу родственники, и у всех фамилия UIResponder. И когда случается какое-нибудь событие — тыкнули в экран, тряхнули телефон, кнопку на клавиатуре нажали — начинается разбор полётов по родственной линии. Система идёт и стучится: «Эй, ты это видел? Ты обработаешь?» И так по цепочке, пока кто-нибудь не скажет: «Да, я в деле, отъебись».

Кто главные в этой семейке?

Кто Чем занимается Где стоит в очереди на пиздюли (цепочке ответчиков)
UIView Это все эти кнопки, текст, картинки — любая херня на экране. Первая линия обороны. Если тыкнули в него — он и отвечает. Если он тупой и не знает что делать — событие идёт дальше.
UIViewController Босс, который управляет кучей этих UIView. Следит за порядком, жизнью и логикой. Часто ловит то, что его вьюхи просрали. Как бы «старший по району».
UIApplication Самое главное начальство, само приложение. Крайняя инстанция. Если все нижестоящие идиоты проигнорировали событие — оно летит сюда. Тут уже или обработают, или выкинут в помойку.
UIWindow Основная площадка, сцена, на которой всё это безобразие происходит. Он как диспетчер: получает событие и говорит — «окей, это событие для вьюхи вот в той части экрана, несите её туда».

Как это родство выглядит в коде, ёпта:

// Все они, в итоге, вышли из одного подъезда — UIResponder.
class MyView: UIView {} // UIView -> UIResponder
class MyScreenManager: UIViewController {} // UIViewController -> UIResponder
let chief = UIApplication.shared // UIApplication -> UIResponder
let stage = UIWindow() // UIWindow -> UIView -> UIResponder

А нахуя это всё понимать? Да затем, что без этого ты как слепой котёнок. Хочешь сделать, чтобы по двойному тапу фон менялся? Или чтобы кастомная клавиатура работала? Или чтобы встряхивание отменяло действие? Всё это крутится вокруг цепочки ответчиков.

Если ты не понял, как событие гуляет по этой цепи, ты будешь тыкаться в дебаггере, как мудак, и спрашивать: «Ну почему же мой метод touchesBegan не вызывается, блядь?!». А потому, что какая-то промежуточная вьюха его съела, или цепочка не туда пошла.

Короче, UIResponder — это фундамент, на котором держится вся интерактивность. Не понял этого — пиши пропало, дальше будет только больнее.