Какова иерархия наследования класса UIButton в UIKit?

Ответ

UIButton наследуется от UIControl, который, в свою очередь, наследуется от UIView. Полная цепочка наследования выглядит так:

NSObject → UIResponder → UIView → UIControl → UIButton

Что это означает на практике:

  1. От UIView: UIButton получает все свойства и методы для отображения на экране:

    • frame, bounds, backgroundColor
    • addSubview(_:), removeFromSuperview()
    • Система Auto Layout (translatesAutoresizingMaskIntoConstraints).
  2. От UIControl: UIButton наследует механизм Target-Action для обработки событий и управление состояниями:

    • addTarget(_:action:for:)
    • Свойство isEnabled
    • Состояния: .normal, .highlighted, .disabled, .selected.
  3. От UIResponder: Возможность участвовать в цепочке ответчиков (responder chain) для обработки событий касания, встряхивания и т.д.

  4. От 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

А на практике это, блядь, означает вот что:

  1. От UIView: Кнопка получает всё, чтобы быть видимой хуйней на экране. Координаты (frame), фон (backgroundColor), возможность запихнуть в неё другие вьюхи (addSubview) или выпихнуть. И, конечно, этот ёбаный Auto Layout.

  2. От UIControl: А вот тут самое сокровище! Механизм Target-Action, чтобы привязать действие по нажатию (addTarget). Плюс управление состояниями: обычная, нажатая, выключенная, выбранная. Свойство isEnabled — тоже отсюда, чтобы кнопку можно было вырубить, как говно.

  3. От UIResponder: Возможность участвовать в цепочке ответчиков. То есть кнопка может ловить касания, встряхивания и прочую хуету, если захочет.

  4. От 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. Это даёт гибкость, а гибкость — это охуенно.

Короче, это не просто сухая теория, а понимание, как эта пирожинка устроена изнутри. Без этого твоя кастомизация будет дергаться, как сука на батарейках.