В iOS нет простого способа найти firstResponder
. Ответы выше только отслеживают UIView
s, но все подклассы UIResponder
, такие как UIViewController
, могут быть первым ответчиком.
Согласно Quick Help
UIResponder
из:
Многие ключевые объекты также ответчики, в том числе объекта UIApplication , объекты UIViewController, и все объекты UIView (который включает в себя UIWindow). По мере того как события происходят, UIKit отправляет их к вашим объектам-ответчикамдля обработки.
И единственный способ следовать UIResponder
цепи будет использовать UIResponder
«s next: UIResponder
свойства.
Возвращает следующий ответчик в цепочке ответчиков, или nil, если нет следующего ответчика. Класс 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
«S братьев и сестер. Я думаю, если вы действительно хотите отслеживать их все, вам нужно проверить тип ответчика и отслеживать его дочерний элемент (subview, child view controller).
Сколько текстовых полей у вас есть в tableView? –
Они динамически созданы, но я нашел способ только сейчас – Armand
Рад это знать, просто опубликуйте его как ответ. :) –