UIResponder - это абстрактный класс в UIKit, который является базовым классом для всех объектов, способных обрабатывать и реагировать на события. Это фундаментальная часть архитектуры iOS, образующая цепочку responder'ов (responder chain).
Ключевые классы, наследующие от UIResponder:
Это динамическая последовательность объектов UIResponder, через которые передаются события, если текущий responder не может их обработать.
Порядок цепочки:
// Пример проверки цепочки responder'ов
extension UIResponder {
func printResponderChain() {
var responder: UIResponder? = self
while let current = responder {
print(current)
responder = current.next
}
}
}
// Начало касания
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
// Движение пальца
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
// Конец касания
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
// Отмена касания (прервано системой)
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
// Shake-жест
override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
override func copy(_ sender: Any?)
override func paste(_ sender: Any?)
Это объект, который первым получает события ввода. Типичные примеры:
Управление первым responder'ом:
// Стать первым responder'ом
textField.becomeFirstResponder()
// Перестать быть первым responder'ом
textField.resignFirstResponder()
// Проверить, является ли первым responder'ом
if textField.isFirstResponder {
// Действия
}
class CustomView: UIView {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Обработка начала касания
super.touchesBegan(touches, with: event) // Для передачи по цепочке
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Обработка, если не обработано view
if !isTouchHandled {
super.touchesBegan(touches, with: event)
}
}
Можно добавлять общую логику через extension:
extension UIResponder {
func findViewController<T: UIViewController>() -> T? {
var responder: UIResponder? = self
while let current = responder {
if let vc = current as? T {
return vc
}
responder = current.next
}
return nil
}
}
UIResponder - это фундаментальный механизм iOS для обработки событий, образующий гибкую и расширяемую систему через responder chain. Понимание его работы критично для создания интерактивных интерфейсов и кастомной обработки пользовательского ввода.