Как исключить UIView или UIViewController из цепочки ответов (Responder Chain) в UIKit?

«Как исключить UIView или UIViewController из цепочки ответов (Responder Chain) в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Responder Chain — это цепочка объектов (UIResponder), по которой распространяются события (касания, встряхивания, команды меню и т.д.). Чтобы исключить участника:

1. Переопределение свойства next Можно «пропустить» себя, вернув следующего ответчика дальше по цепочке.

class CustomView: UIView {
    override var next: UIResponder? {
        // Пропускаем родительский UIView и передаём событие дальше
        return super.next?.next
    }
}

2. Запрет стать First Responder Объект, который не может стать first responder, не будет получать события, предназначенные для него (например, ввод текста).

override var canBecomeFirstResponder: Bool {
    return false
}

3. Принудительный отказ от статуса First Responder Если объект в данный момент является first responder, можно заставить его уступить этот статус.

myTextField.resignFirstResponder()
// Или для любого UIResponder:
_ = myCustomView.resignFirstResponder()

4. Игнорирование конкретных событий Более точечный подход — переопределить методы обработки событий, чтобы они не передавались дальше.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Не вызываем super — событие не пойдёт дальше по Responder Chain.
    // Выполняем только своё действие.
    handleTouchInternally()
}

Практический пример: Допустим, у вас есть контейнерная вью (ContainerView), которая должна игнорировать все касания, передавая их сразу дочерним элементам.

class PassthroughView: UIView {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, with: event)
        // Если касание пришлось на саму PassthroughView, игнорируем её.
        return hitView == self ? nil : hitView
    }
}

Важно: Изменение стандартного поведения Responder Chain может нарушить ожидаемую логику работы контролов (кнопок, текстовых полей) и доступность. Действуйте осознанно.