Ответ
UIButton наследуется от UIControl, который, в свою очередь, наследуется от UIView. Полная цепочка наследования выглядит так:
NSObject → UIResponder → UIView → UIControl → UIButton
Что это означает на практике:
-
От
UIView:UIButtonполучает все свойства и методы для отображения на экране:frame,bounds,backgroundColoraddSubview(_:),removeFromSuperview()- Система Auto Layout (
translatesAutoresizingMaskIntoConstraints).
-
От
UIControl:UIButtonнаследует механизм Target-Action для обработки событий и управление состояниями:addTarget(_:action:for:)- Свойство
isEnabled - Состояния:
.normal,.highlighted,.disabled,.selected.
-
От
UIResponder: Возможность участвовать в цепочке ответчиков (responder chain) для обработки событий касания, встряхивания и т.д. -
От
NSObject: Базовая функциональность Objective-C runtime (например, KVO).
Пример проверки иерархии:
let button = UIButton()
// Проверка с помощью isKind(of:)
print(button.isKind(of: UIControl.self)) // true
print(button.isKind(of: UIView.self)) // true
print(button.isKind(of: UIResponder.self)) // true
// Вывод имени класса предка
print(type(of: button).superclass()) // Optional(UIControl)
print(UIControl.superclass()) // Optional(UIView)
Почему это важно? Понимание иерархии позволяет:
- Предсказывать, какие методы и свойства доступны у
UIButton. - Создавать кастомные кнопки, правильно переопределяя методы (например,
touchesBeganизUIResponderилиbeginTrackingизUIControl). - Эффективно использовать полиморфизм, работая с кнопкой как с
UIViewилиUIControl.
Ответ 18+ 🔞
Давай разберем эту иерархию наследования, а то некоторые думают, что кнопка — это просто такая волшебная хуйня, которая нажимается.
Смотри, UIButton — это как матрешка, только в пидорасину. Внутри неё сидит UIControl, внутри того — UIView, а в самом ядре — UIResponder и NSObject. Полная цепочка — вот эта пизда:
NSObject → UIResponder → UIView → UIControl → UIButton
А на практике это, блядь, означает вот что:
-
От
UIView: Кнопка получает всё, чтобы быть видимой хуйней на экране. Координаты (frame), фон (backgroundColor), возможность запихнуть в неё другие вьюхи (addSubview) или выпихнуть. И, конечно, этот ёбаный Auto Layout. -
От
UIControl: А вот тут самое сокровище! Механизм Target-Action, чтобы привязать действие по нажатию (addTarget). Плюс управление состояниями: обычная, нажатая, выключенная, выбранная. СвойствоisEnabled— тоже отсюда, чтобы кнопку можно было вырубить, как говно. -
От
UIResponder: Возможность участвовать в цепочке ответчиков. То есть кнопка может ловить касания, встряхивания и прочую хуету, если захочет. -
От
NSObject: Ну, это уже база, корни, Objective-C runtime, KVO — в общем, фундамент, без которого всё нахуй развалится.
Пример, как проверить, кто её предок:
let button = UIButton()
// Проверка isKind(of:) — типа "ты от этого произошёл?"
print(button.isKind(of: UIControl.self)) // true
print(button.isKind(of: UIView.self)) // true
print(button.isKind(of: UIResponder.self)) // true
// А можно спросить прямо: "эй, класс, кто твой папа?"
print(type(of: button).superclass()) // Optional(UIControl)
print(UIControl.superclass()) // Optional(UIView)
А зачем это всё, блядь, знать? Да затем, что без этого ты будешь как обезьяна с гранатой.
- Предсказываешь поведение: Зная предков, ты сразу понимаешь, что у кнопки есть
frame,addTargetи она может бытьisEnabled. - Кастомизируешь правильно: Захотел переопределить реакцию на касание? Лезешь не в
UIButton, а смотришь методыUIResponder(touchesBegan) илиUIControl(beginTracking). Не тыкайся вслепую, ебанашка! - Используешь полиморфизм: Можешь работать с кнопкой как с абстрактным
UIViewилиUIControl. Это даёт гибкость, а гибкость — это охуенно.
Короче, это не просто сухая теория, а понимание, как эта пирожинка устроена изнутри. Без этого твоя кастомизация будет дергаться, как сука на батарейках.