Нет простого способа найти firstResponder
в iOS.Ответы выше только отслеживания UIView
с, но все подклассы UIResponder
, такие как UIViewController
могут быть первыми респондентом.
В соответствии с Quick Help
из UIResponder
:
Многие ключевые объекты также являются респондентами, включая объект UIApplication, объекты UIViewController и все объекты UIView (включая UIWindow).Когда происходят события, UIKit отправляет их объектам респондента вашего приложения для обработки.
И единственный способ следовать цепочке UIResponder
- использовать свойство UIResponder
next: UIResponder
.
Возвращает следующего респондента в цепочке респондентов или ноль, если следующего респондента нет.Класс UIResponder не сохраняет и не устанавливает следующий респондент автоматически, поэтому этот метод возвращает nil по умолчанию.Подклассы должны переопределить этот метод и вернуть соответствующий следующий респондент.Например, UIView реализует этот метод и возвращает объект UIViewController, который управляет им (если он есть) или его суперпредставлением (если это не так).UIViewController аналогичным образом реализует метод и возвращает суперпредставление своего представления.UIWindow возвращает объект приложения.UIApplication возвращает nil.
В большинстве UIKit
объект superview
, UIViewController
, UIWindow
, UIApplication
или Appdelegate
будет next
UIResponder
.
extension UIResponder {
func findFirstResponder() -> UIResponder? {
var responder: UIResponder? = self
while responder != nil {
guard let r = responder, r.isFirstResponder() else {
responder = responder?.next
continue
}
return r
}
return nil
}
}
Однако вышесказанное не отслеживает братьев и сестер responder
.Я думаю, что если вы действительно хотите отслеживать их все, вам нужно проверить тип респондента и отследить его дочерний элемент (подпредставление, контроллер дочернего представления).