От какого класса наследуется UIButton?
Что проверяют
Знаете ли вы цепочку наследования UIKit и понимаете ли, что каждый её уровень даёт кнопке. Вопрос выглядит проверкой зубрёжки, но настоящий интерес дальше: откуда у кнопки состояния, кто принимает касание и почему заголовок ставится методом, а не через titleLabel.
Как отвечать
Назовите всю цепочку: UIButton наследуется от UIControl, тот от UIView, дальше UIResponder и NSObject. И сразу расшифруйте, что откуда:
UIControlдаёт механизм цель-действие (addTarget(_:action:for:)) и состоянияnormal,highlighted,selected,disabledвместе с флагамиisEnabledиisSelected;UIViewотвечает за геометрию, слой, скругления, автолейаут и анимации;UIResponderприносит обработку касаний и цепочку респондеров, по которой событие идёт выше, если кнопка его не обработала;NSObjectдаёт базовый рантайм: KVC, KVO,responds(to:).
Полезно добавить, что визуал исторически задавался парами методов на каждое состояние (setTitle(_:for:), setImage(_:for:)), а в современном UIKit это делает UIButton.Configuration вместе с UIAction вместо селектора.
var config = UIButton.Configuration.filled()
config.title = "Оплатить"
let button = UIButton(configuration: config, primaryAction: UIAction { _ in send() })Где спотыкаются
Говорят, что кнопка наследуется прямо от UIView. После этого невозможно объяснить, откуда взялись addTarget и состояния: их вводит именно UIControl, а UIView про взаимодействие не знает ничего.
Ставят текст через button.titleLabel?.text. При следующей смене состояния UIKit перерисует заголовок из своей таблицы значений, и присвоенная строка молча исчезнет.
Путают selected и highlighted. Подсветка живёт, только пока палец на кнопке, а выбранное состояние держится, пока его не снимут, и переключатель на подсветке работать не будет.